Pytest测试框架(四)运行方式

1.测试类主函数模式

  pytest.main("-s  test_abc.py")
 # file_name: test_abc.py
 import pytest # 引入pytest包
 def test_a(): # test开头的测试函数
     print("------->test_a")
     assert 1 # 断言成功
 def test_b():
     print("------->test_b")
     assert 0 # 断言失败
 if __name__ == '__main__':
        pytest.main("-s  test_abc.py") # 调用pytest的main函数执行测试

2.命令行模式

  pytest 文件路径/测试文件名
  例如:pytest ./test_abc.py

3. 在第N个用例失败后,结束测试执行

pytest -x                    # 第01次失败,就停止测试
pytest --maxfail=2     # 出现2个失败就终止测试

4.指定测试模块

pytest test_mod.py

5.指定测试目录

pytest testing/

6.-k 匹配用例名称

通过关键字表达式过滤执行;匹配:可全名,也可以模糊

pytest -k "MyClass and not method"

这条命令会匹配文件名、类名、方法名匹配表达式的用例,这里这条命令会运行 TestMyClass.test_something, 不会执行 TestMyClass.test_method_simple

7. -m 选择对应的标签(mark标签)

标签没有注册,pytest不能识别

PytestUnknownMarkWarning: Unknown pytest.mark.shop - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/latest/mark.html
    @pytest.mark.shop

pyetst.ini配置文件内容:

[pytest]
markers =
    login: Run login case
    myShop: Run myShop case
一个:
 '-m','lesson_add'
多个:
 '-m','lesson_add or lesson_list'
排除法:
   '-m','not lesson_add '
排除法 多个:
   '-m','not (lesson_add or lesson_list)'

8.-v 节点–多层化

示例: test_lesson.py::TesLesson::test_lesson_add # 测试文件::测试类::测试方法

pytest -v  test_lesson.py::TesLesson::test_lesson_add

9.-s :显示标准输出,例如print()的语句;

10.-q :显示简洁报告;

11. 多进程运行cases

当cases量很多时,运行时间也会变的很长,如果想缩短脚本运行的时长,就可以用多进程来运行。

安装pytest-xdist:

pip install -U pytest-xdist

运行模式:其中NUM填写并发的进程数。

pytest test_se.py -n NUM

12.重试运行cases

在做接口测试时,有事会遇到503或短时的网络波动,导致case运行失败,而这并非是我们期望的结果,此时可以就可以通过重试运行cases的方式来解决。

安装pytest-rerunfailures:

pip install -U pytest-rerunfailures

运行模式:NUM填写重试的次数。

pytest test_se.py --reruns NUM

13.高阶用法

13.1.跳过测试函数

在我们自动化测试过程中,经常会遇到功能阻塞、功能未实现、环境等一系列外部因素问题导致的一些用例执行不了,这时我们就可以用到跳过skip用例,如果我们注释掉或删除掉,后面还要进行恢复操作。
跳过–skip——-相当于注释的效果
有条件的跳过–skipif–-在执行过程中会对项目的一些前置条件进行判断**
如果您希望有条件地跳过某些内容,则可以使用skipif代替。 if条件为真,跳过

根据特定的条件,不执行标识的测试函数.

 方法:
     skipif(condition, reason=None)
 参数:
     condition:跳过的条件,必传参数
     reason:标注原因,必传参数
 使用方法:
     @pytest.mark.skipif(condition, reason="xxx")
import pytest
class Test_ABC:
    def setup_class(self):
        print("------->setup_class")
    def teardown_class(self):
        print("------->teardown_class")
    def test_a(self):
        print("------->test_a")
        assert 1
    @pytest.mark.skipif(condition=2>1,reason = "跳过该函数")
    def test_b(self):
        print("------->test_b")
            assert 0
执行结果:
   test_abc.py
   ------->setup_class
   ------->test_a
   .
   ------->teardown_class
       s

代码实际应用:

@pytest.mark.shop
@allure.epic('外卖项目-接口测试')
@allure.feature('店铺模块')
class TestShop:
    def setup_class(self):

        self.token = Login().login({'username':'sq0777','password':'xintian'},getToken=True)

        self.shop = Shop(self.token)

    @allure.story('店铺列出')
    @allure.title('店铺列出用例')
    @pytest.mark.shop_list
    @pytest.mark.parametrize('inData,respData',get_excelData('我的商铺','listshopping'))
    def test_shop_list(self,inData,respData):

        res = self.shop.shop_list(inData)
        '''
        如果断言不是一个属性,需要多个组合判断?
        原理:assert   布尔表达式       多个条件使用and  or
        '''
        if 'code' in respData:
            assert res['code'] == respData['code']
        else:
            assert res['error'] == respData['error']

    reason='登录失败,先跳过不执行下面的接口!')
    @allure.story('店铺更新')
    @allure.title('店铺更新用例')
    @pytest.mark.shop_update
    @pytest.mark.parametrize('inData,respData', get_excelData('我的商铺', 'updateshopping'))
    def test_shop_update(self,inData,respData,shop_update_init):

        with allure.step('第1步:登录'):
            print('登录')
        with allure.step('第2步:店铺更新操作'):
            res = self.shop.shop_update(inData,shop_update_init[0],shop_update_init[1])

        assert res['code'] == respData['code']

13.2标记为预期失败函数

标记测试函数为失败函数
 方法:
     xfail(condition=None, reason=None, raises=None, run=True, strict=False)
 常用参数:
     condition:预期失败的条件,必传参数
     reason:失败的原因,必传参数
 使用方法:
     @pytest.mark.xfail(condition, reason="xx")
import pytest
class Test_ABC:
    def setup_class(self):
        print("------->setup_class")
    def teardown_class(self):
        print("------->teardown_class")
    def test_a(self):
        print("------->test_a")
        assert 1
    @pytest.mark.xfail(2 > 1, reason="标注为预期失败")
       def test_b(self):
           print("------->test_b")
          assert 0
   执行结果:
       test_abc.py
       ------->setup_class
       ------->test_a
       .
       ------->test_b
       ------->teardown_class
       x

Original: https://blog.csdn.net/Michaelyq1229/article/details/115279972
Author: 凡晨丹心
Title: Pytest测试框架(四)运行方式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/776114/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python kfold交叉验证_kfold交叉验证python

    我是python的初学者。我写了下面的函数来分区从csv文件读取的数据。索引生成没有错误,但是当我用这个索引拆分df时,结果是不正确的。我的代码怎么了?在def partition…

    Python 2023年8月19日
    068
  • linux 下通过fork实现后台运行进程

    1 # 通常建议使用双fork方法。在每个fork处,父级退出,子级继续 2 3 #!/usr/bin/env python 4 5 import time,platform 6 …

    Python 2023年6月10日
    092
  • 全连接神经网络 MLP

    全连接神经网络–MLP 全连接神经网络,又叫多层感知机,是一种连接方式较为简单的人工神经网络,是前馈神经网络的一种。 MLP的神经网络架构 网络架构为: 通过输入层,隐藏层,输出层…

    Python 2023年8月1日
    0109
  • Seata 1.5.2 源码学习(事务执行)

    关于全局事务的执行,虽然之前的文章中也有所涉及,但不够细致,今天再深入的看一下事务的整个执行过程是怎样的。 TransactionManager io.seata.core.mod…

    Python 2023年10月14日
    069
  • 巨头游戏:Instagram 将运行 Polygon 支持的 NFT 市场

    Meta 宣布社交媒体巨头 Instagram 将推出一个在 Polygon 支持下运行的不可替代代币 (NFT) 市场。 “创作者很快就能在 Instagram 上制…

    Python 2023年11月8日
    064
  • 如何使用 pandas 操作 excel 并显示dataframe多行, 全列

    转帖一个好文 excel 操作https://shazhenyu.blog.csdn.net/article/details/83104653?utm_medium=distrib…

    Python 2023年8月20日
    099
  • Python制作自动答题脚本,100%准确率,1秒10题提高效率

    前言 环境使用 Python 3.8 Pycharm 模块使用 import requests —> 数据请求模块 pip install requests import p…

    Python 2023年6月9日
    0100
  • nms和P,R,map原理及在Yolov5代码中的解析

    将非极大值抑制(nms)和map放在一块进行讲解分析,因为其都是通过IOU和置信度(score)来计算,但两者方式不一样,容易产生干扰,NMS通过IOU来过滤掉候选框,而map通过…

    Python 2023年10月9日
    0148
  • python pygame鼠标点击_python学习之GUI(pygame鼠标)

    鼠标的位置和其他PyGame的程序一样使用坐标来表示。坐标的值经常使用x和y变量来表示。左上角的坐标值是0,0,x和y的值随着鼠标的向右和向下的移动而增加。 打印鼠标左键点击位置i…

    Python 2023年9月23日
    056
  • Cartopy绘图入门指南

    前言 嗨,你好,我是来自点点GIS的南南 我与Cartopy的认识起源于”气象水文科研猫”的这个推文,那时候的我觉得,用代码画地图好酷,arcgis就感觉l…

    Python 2023年8月30日
    0169
  • Django结合七牛云实现对象云储存

    在Django中结合第三方…

    Python 2023年8月6日
    092
  • 深度学习之残差网络

    资料下载 链接:https://pan.baidu.com/s/1mTqblxzWcYIRF7_kk8MQQA提取码:7x6w 资料的下载真的很感谢(14条消息) 【中文】【吴恩达…

    Python 2023年10月24日
    067
  • 10个优秀的Python库,实用且有趣

    为什么这么多人选择学习python?首先,python是一门全场景编程语言,对于初学编程的人而言,选择一门全场景编程语言是非常不错的选择;其次,python语言简单易学,对初学者十…

    Python 2023年9月18日
    086
  • 数据聚合与分组运算

    一、分组与聚合的原理 在Pandas 中,分组是指使用特定的条件将原数据划分为多个组,聚合在这里指的是,对每个分组中的数据执行某些操作,最后将计算的结果进行整合。 分组与聚合的过程…

    Python 2023年8月8日
    081
  • 初遇 chatGPT

    背景 今天终于有时间尝试一下心心念的 chatGPT。注册了一下,然后尝试问了一些问题。不刁钻,结果确实令人惊艳。17年我在做自然语言处理学习的时候,还是 Tensorflow 1…

    Python 2023年11月4日
    062
  • python基于scrapy框架爬取数据并写入到MySQL和本地

    目录 1.安装scrapy 2.创建项目 3.工程目录结构 4.工程目录结构详情 5.创建爬虫文件 6.编写对应的代码在爬虫文件中 7.执行工程 8.scrapy数据解析 9.持久…

    Python 2023年10月1日
    063
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球