------------------------------Day 1-----------------------------------------------------
1.下载本地安装包: PyPI · The Python Package Index
pytest-7.1.2.tar.gz
allure-pytest-2.9.45.tar.gz
解压下载好的tar.gz文件进行安装:
对应目录文件夹执行命令即可:python setup.py install
2.下载配置文件:Releases · allure-framework/allure2 · GitHub
allure-2.13.8.zip
解到python目录,进行配置
配置后CMD,看看配置是否成功
3.IDE查看一下是否安装成功
4.执行一下pytest用例: Pytest_Demo.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import pytest
import allure
@allure.feature("test")
class Test_SWapi():
'''运行Py-test执行用例:pytest -vs Pytest_Demo.py '''
def setup(self):
self.url_member = 'http://member-service.xxx.cn'
self.App_token = token()
self.php_token = token_E()
url_prod = 'http://marketing-service.xxx.com/login/user?email=xxx@xxx.cn&password=gao123456'
Res_prod = requests.get(url_prod)
url_tokenid_E = 'xxx.securityservice.tokenid=' + Res_prod.json()["data"]["tokenID"]
self.header_token_prod = {'Content-Type': 'application/json',
'Cookie': url_tokenid_E,
'User-Agent': 'Dalvik/2.1.0'}
def teardown(self):
pass
@allure.story("001")
def test_member_login(self):
url = self.url_member + '/member/member/get?memberCode=5102252'
Res = requests.get(url,headers=self.App_token)
assert Res.status_code == 200
def test_member_loginA(self):
url = self.url_member + '/member/login'
data = {
"deviceId": "123123123",
"identity": "13763312225",
"identityType": 0,
"password": "111111",
"platformSource": "Mall",
"remember": 'true',
"terminalType": "PC"
}
Res = requests.post(url,data=json.dumps(data),headers = self.php_token )
assert Res.status_code == 200
def teSst_UartisanUser(self):
'''更新名匠商家后台密码'''
self.url_security = 'http://security-service.xxx.com'
phone =''
security_token = self.header_token_prod
url_getList = self.url_security + '/security/user/getList'
data_getList = {
"pager": {
"now": 0,
"size": 1,
"total": 1
},
"search": [
{
"name": "phone",
"value": phone
}
],
"sort": [
{
"asc": 'true',
"name": "string"
}
]
}
Res_A = requests.post(url=url_getList,
data=json.dumps(data_getList),
headers = security_token)
userCode = Res_A.json()['data']['list'][0]['userCode']
userName = Res_A.json()['data']['list'][0]['userName']
departmentCode = Res_A.json()['data']['list'][0]['departmentCode']
employeeCode = Res_A.json()['data']['list'][0]['employeeCode']
email = Res_A.json()['data']['list'][0]['email']
password = '123456'
url_update = self.url_security + '/security/user/update'
data_update = {
"departmentCode": departmentCode,
"email": email,
"employeeCode": employeeCode,
"password": password,
"phone": phone,
"userCode": userCode,
"userName": userName
}
Res_B = requests.post(url=url_update,
data=json.dumps(data_update),
headers =security_token )
print(Res_B.json())
def test_link_center(self):
result = requests.get(self.url_member + '/member/center/get',
headers= self.App_token)
assert result.status_code == 200
def test_link_pointFlowHead(self):
result = requests.get(self.url_member + '/member/center/pointFlowHead',
headers= self.App_token)
assert result.status_code == 200
@pytest.mark.parametrize('phone',
['13763312225',
'13247026377',
'13577798350'])
def test_getByPhone(self,phone):
# 用例参数化
result = requests.get(self.url_member + '/member/member/getByPhone?phone='+phone,
headers=self.php_token)
assert result.status_code == 200
@pytest.fixture()
def getLogin_fixture(self):
RBG = {
"pager": {
"now": 0,
"size": 1,
"total": 1
},
"search": [
{
"name": "phone",
"value": "13763312225"
}
],
"sort": [
{
"asc": '',
"name": "string"
}
]
}
return RBG
@pytest.mark.xfail(reason = 'xfail api')
def test_getLogin_xfail(self,getLogin_fixture):
result = requests.post(self.url_member + '/member/member/getLogin',
data=json.dumps(getLogin_fixture), headers=self.php_token)
assert result.status_code == 200
@pytest.mark.skip(reason = 'skip api')
def test_getLogin_skip(self,getLogin_fixture):
result = requests.post(self.url_member + '/member/member/getLogin',
data=json.dumps(getLogin_fixture), headers=self.php_token)
assert result.status_code == 200
@pytest.mark.unfinished
def test_getLogin_unfinished(self,getLogin_fixture):
'''标记,unfinished不执行用例'''
result = requests.post(self.url_member + '/member/member/getLogin',
data=json.dumps(getLogin_fixture), headers=self.php_token)
assert result.status_code == 200
def test_getLogin_raises(self,getLogin_fixture):
with pytest.raises(TypeError) as f:
result = requests.post(self.url_member + '/member/member/getLogin',
data=json.dumps(getLogin_fixture), headers=self.php_token)
exec_msg = f.value.args[0]
assert exec_msg == '123'
def test_getLogin_fixture(self,getLogin_fixture):
print(getLogin_fixture)
result = requests.post(self.url_member + '/member/member/getLogin',
data=json.dumps(getLogin_fixture), headers=self.php_token)
print(result.json())
pytest -s Pytest_Demo.py --alluredir report
生成Html报告,并清楚之前的数据
allure generate --clean report
保存测试报告
allure serve report
默认访问地址:http://localhost:60684/index.html#
Pytest 【关于失败重跑】
*安装插件【pytest-rerunfailures】
*命令执行:pytest Pytest_Demo.py --reruns Num
Num:重跑次数
没有重跑执行,如下:
构建成功了,发个邮件通知一下相关人员【只有笔者】
邮一、假如Jenkins没有安装Email Plugin,来插件中心安装一下
邮二、Jenkins配置中心,配置邮箱信息
成功安装插件,配置中心会有下面这个E-mail配置项【下面以QQ为例,按步填入即可;重点凭证不是邮箱账号密码,是邮箱】
Ps:开启后要注意的是我们要把最后弹窗中的“授权码”复制下来,以作为凭证的密码使用
下面配置为什么情况下发送邮件【Default Triggers 】这里选择总是发送
Extended E-mail Notification配置到这里基本是完成了【如还需全局配置邮件信息也可以配置一下默认项Default Content Type、Default Recipients、Default Subject、Default Content】
邮三、邮件通知这里凭证,同样使用邮箱的授权码
配置成功后,测试一下能不能收到邮件
邮件接收成功,钉。。。
看到这里Jenkins系统配置基本完成了;下面继续配置job邮件自定义信息
邮四、发件人不填写或与Jenkins的邮箱不一致,最终也不能发送成功
自定义job发送邮件信息,如下
网上模版本很多,随意拿一个过来使用即可
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
offset="0">
<h3>以下是Jenkins自动发送的邮件,请勿回复!</h3>
<div>
<table width="95%" cellpadding="0" cellspacing="0"
style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
<th><br />
<h2>构建信息</h2>
</th>
</tr>
<tr>
<td>
<ul>
<li>项目名称 : ${PROJECT_NAME}</li><br />
<li>测试报告 : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li><br />
<li>触发原因: ${CAUSE}</li><br />
<li>项目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li><br />
</ul>
</td>
</tr>
</table>
</div>
</body>
</html>
重点:Triggers,是系统配置的情况勾选包含的其中之一,如添加没有包含项即发送失败【上面笔者选了Always,所有这里同样选择Always即可】
填写接收人邮件,保存并构建一下项目,看看能不能收到邮件
构建成功,实现收到构建邮件。