Django+Pytest+Jenkins搭建持续集成自动化测试

时间:2023-02-07 19:10:06

系统环境

采用的是Mac系统环境下搭建自动化框架。

设计思路

持续集成测试:定时某时间自动执行测试脚本,接口测试可用Jmeter+ant+allure+Jenkins进行搭建接口持续集成测试,这个针对不会编程人员做的,本文介绍搭建的思路。

思路:对于持续集成测试,我们可以采用市场上的多种多样来做,但是我希望我的自动化框架可以发送邮件提醒、给参与测试或直接上级查看当天生成的测试报告,也可以查看员人看到执行了哪些测试用例。


安装JAVA

安装jdk(版本:jdk1.8.0_341)
下载jdk,进行解压
环境配置:vim /etc/profile
export JAVA_HOME=路径
exprot PATH=$JAVA_HOME/bin:$PATH

安装Python

  1. 配置Python环境

安装Python(版本:3.8)
下载Python,进行解压
环境配置:vim /etc/profile
export PYTHON_HOME=路径
exprot PATH=$JAVA_HOME/bin:$PYTHON_HOME/bin:$PATH
  1. Pytest测试框架是目前市场上主流的框架,做接口测试框架,allure主流的生存html文件的测试报告,Django是Python Web框架中四大主流框架。

pip install
pytest==7.2.0
pytest-html==3.2.0
requests==2.28.1
allure-pytest==2.11.1
pytest-base-url==2.0.2
django==4.1.6
netifaces==0.11.0
smtplib
email

安装Allure框架

安装allure(版本:2.11.0)
下载allure,进行解压
环境配置:vim /etc/profile
export ALLURE_HOME=路径
exprot PATH=$JAVA_HOME/bin:$PYTHON_HOME/bin:$ALLURE_HOME/bin:$PATH

安装Jenkins

安装jenkins
下载jenkins,进行解压
环境配置:vim /etc/profile
export JENKINS_HOME=路径
exprot PATH=$JAVA_HOME/bin:$PYTHON_HOME/bin:$ALLURE_HOME/bin:$JENKINS_HOME:$PATH

项目实战

Django项目

django-admin statproject Fieldassistant_automation
cd Fieldassistant_automation
python manage.py startapp automation

Expertautomated_test/settings:Django的配置信息

#改完前
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
#改完后
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'static')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},

#改完后
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
工作目录

1. 新建static、casebase、pubilc、email_deckes、logs、result等目录

casebase:测试用例存放目录
public:放公共部分目录,例如:封装获取token、IP、端口等
automation:Django的应用模块
email_deckes:存放发送访问地址到邮箱目录
logs:放log日志目录
result:执行测试用例的结果数据(json)目录
static:存放静态文件目录
文件存放
case.py文件

'''
casebase/case.py
存放测试用例
'''
......
get_user_list_tre = [
[[{"access-token":test_login()[0],"user_id":test_login()[1]}],{"errcode":-1,"end":"token正确、user_id正确,获取用户列表成功"}],
[[{"access-token": "", "user_id": test_login()[1]}],{ "errcode": 401, "end": "token为空、user_id正确,获取用户列表失败"}],
[[{"access-token": "saddas", "user_id": test_login()[1]}],{ "errcode":401, "end": "token错误、user_id正确,获取用户列表失败"}],
[[{"access-token": test_login()[0], "user_id": ""}],{ "errcode":40001, "end": "token正确、user_id为空,获取用户列表失败"}],
[[{"access-token": test_login()[0], "user_id": "oo"}],{ "errcode":40001, "end": "token正确、user_id错误,获取用户列表失败"}],
[[{"access-token": "", "user_id": ""}],{ "errcode": 401, "end": "token、user_id为空,获取用户列表失败"}],
[[{"access-token": "sadads", "user_id": "4"}],{ "errcode": 401, "end": "token、user_id错误,获取用户列表失败"}],

]
.......
test_public.py文件

'''
public/test_public.py文件
放公共部分目录,例如:封装获取token、IP、端口等
'''

封装url和headers
class Test_public():
url = "地址"
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
}
data = {
"username":"用户名",
"password":"密码"
}

#封装登录之后获取access_token值
def test_login():
url = Test_public.url+"URL地址"
restart = requests.post(url=url,headers=Test_public.headers,data=Test_public.data)
restart.encoding = "utf-8"
token = restart.json()["data"]["access_token"]
user_id = restart.json()["data"]["user_id"]

return token,user_id
emailfile.py文件

# -*- coding:utf-8 -*-


'''

email_deckes/emailfile.py:发送邮件提醒模块
'''
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import netifaces

class Mail:

'''
自动发送测试报告,每天定期发送。
'''

def __init__(self):

'''获取IP地址'''
# 该default键表示我们的默认网关,并且键的值是一个字典,其中键是地址的家庭,所以要得到我们所需要的接口名称
iface = netifaces.gateways()['default'][netifaces.AF_INET][1]

# 使用以下netifaces.interfaces()方法查找它
ip = str(netifaces.ifaddresses(iface)[netifaces.AF_INET][0]['addr'])

# 第三⽅ SMTP 服务
self.mail_host = "smtp.qq.com" # 设置服务器:这个是qq邮箱服务器,直接复制就可以
self.mail_pass = "....." # 刚才我们获取的授权码
self.sender = '某某' # 你的邮箱地址
self.receivers = ['某某']
#self.receivers = ['',''] # 收件⼈的邮箱地址,可设置为你的QQ邮箱或者其他邮箱,可多个 def send(self):
content = '测试报告的链接:http://{}:8088/static/report/index.html'.format(ip)
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = Header("某某", 'utf-8')
message['To'] = Header("某某", 'utf-8')
subject = '某某接口自动化执行测试报告' # 发送的主题,
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP_SSL(self.mail_host, 465)
smtpObj.login(self.sender, self.mail_pass)
smtpObj.sendmail(self.sender, self.receivers, message.as_string())
smtpObj.quit()
print('邮件发送成功')
except smtplib.SMTPException as e:
print('邮件发送失败')
if __name__ == '__main__':
Mail()
pytest.ini文件

#           pytest框架的配置信息
[pytest]
log_cli = True
log_cli_level = info
log_cli_format = %(asctime)s | %(levelname)s | %(filename)s:%(lineno)s | %(message)s"
log_cli_date_format = %Y-%m-%d %H:%M:%S

log_level = info
log_format = %(asctime)s | %(levelname)s | %(filename)s:%(lineno)s | %(message)s"
log_date_format = %Y-%m-%d %H:%M:%S
test_runserver.py文件

'''
编写测试脚本文件,主文件

'''
import allure
import pytest
from casebase.case import Case
from public.test_public import Test_public,test_login
import requests
from email_deckes.emailfile import Mail
@allure.feature("登录接口")
class Test_login():
@allure.story("登录用例")
@pytest.mark.parametrize("login_test,",Case.login_test)
@allure.title("测试用例:{login_test[2]}")
def test_login(self,login_test):
urls = Test_public.url+"....."
restart = requests.post(url=urls, headers=Test_public.headers, data=login_test[0][0])
restart.encoding = "utf-8"
restart = str(restart.json())
assert str(login_test[1]["errcode"]) in restart
.........
allure.sh文件

#直接执行shell脚本:sh allure.sh
source /etc/profile
pytest test_runserver.py -s -q --alluredir=./result/
allure generate ./result/ -o ./static/report --clean
python3 email_deckes/emailfile.py

项目运行

Djiango运行程序:python3 manage.py runserver 0.0.0.0:8088
allure.sh执行脚本:sh allure.sh
test_runserver.py:主程序,编写接口测试

项目持续集成运行

#mac下终端安装Scree

brew tap homebrew/dupes
brew install screen

screen -S 名字

#到Exptautonmated_test目录下
python3 manage.py runserver 0.0.0.0:8088

#打开jenkins:localhost:8080
#登录构建项目持续集成。
cd ..../Exptautonmated_test
sh allure.sh
#不懂的可以网上搜索jenkins如何构造项目持续集成

最终框架图

Django+Pytest+Jenkins搭建持续集成自动化测试

项目最终展示图

Django+Pytest+Jenkins搭建持续集成自动化测试

Django+Pytest+Jenkins搭建持续集成自动化测试

Django+Pytest+Jenkins搭建持续集成自动化测试