Pytest+Allure安装及使用【持续更新】

------------------------------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即可】

填写接收人邮件,保存并构建一下项目,看看能不能收到邮件

 

 构建成功,实现收到构建邮件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值