首页 > 技术文章 > pytest测试框架介绍(3)

zhaikunkun 2020-03-28 21:26 原文

12.fixture带参数传递

场景:测试离不开数据,为了数据灵活,一般数据都是通过参数传的

解决:fixture通过固定参数request传递;

步骤:在fixture中增加@pytest.fixture(params=[1,2,3,'linda'])在方法参数写request

如下图,运行结果:

参数传入的可以是列表是元祖

如下图,eval将字符串str当成有效的表达式来求值,并返回结果:

  当我们测试登录或者搜索这种同样的场景需要不同的数据时,就可以使用这种参数组合的方法:

 运行结果如下:

 方法名作为参数,indrect=True,可以把传过来的参数当函数执行

 

运行结果如下图:

13.mark中的skip与xfail

skip使用场景

  调试时不想运行这个用例

  标记无法在某些平台上运行的测试功能

  在某些版本中执行,其他版本中跳过

  当前的外部资源不可用时跳过(如果测试数据是从数据库中取到的,连接数据库的功能如果返回结果未成功就跳过,因为执行也都报错)

解决:

@pytest.mark.xfail跳过这个测试用例,可以加条件skipif,在满足条件下才希望通过,否则跳过这个测试。

skipif

xfail场景:

  功能测试尚未实施或者未修复的错误,当测试通过时尽管预计会失败(标记为@pytest.mark.xfail),它是一个xpass将在测试摘要中报告

  你希望测试由于某种情况而就应该失败

解决:

@pytest.mark.xfail

skip的使用:

  

 @pytest.mark.xfail的使用:

 

14.使用自定义标记mark只执行某部分用例

场景:

  只执行符合要求的某一部分用例,可以把一个web项目划分为多个模块,然后指定模块名称执行

  app自动化时,如果想android和ios公用一套代码,也可以使用标记功能,表明哪些是ios用例,哪些是android的,运行代码时指定mark名称运行就可以

解决:

  在测试用例方法上加@pytest.mark.webtest

执行:

  -s 参数:输出所有测试用例的print信息

  -m:执行自定义标记的相关用例pytest -s test_mark.py

  pytest -s test_mark.py -m=webtest

  pytest -s test_mark.py -m apptest

  pytest -s test_mark.py -m "not ios"

执行pytest -v -s test_case/test_fix.py -m=search命令 ,还可以使用and、or、not 这些逻辑符指定运行哪些标签,运行结果:

 如何去掉warning呢? 可以在conftest.py文件中添加标签,以上运行的时候就不会提示warning:找不到这些名字了;在conftest.py文件中加入pytest_configure函数,注意⚠️一定要使用这个函数中的markers遍历,也必须是

pytest_configure文件名的函数

 15.多线程并行与分布式执行

场景:

  测试用例1000条,一个用例执行1分钟,一个测试人员执行需要1000分钟,通常我们会用人力成本换取时间成本

  加几个人一起执行,时间就会缩短,如果10人一起执行只需要100分钟,这就是一种并行测试,分布式场景

解决:

  pytest分布式执行插件:pytest-xdist,多个cpu或主机执行前提:用例之间都是独立的,没有先后顺序,随机都能执行,可重复运行不影响其他用例

安装:

  pip3 install pytest-xdist

  多个cpu并执行用例,直接加-n 3是执行并行数量:pytest -n 3

  在多个终端下一起执行

16.生成html测试报告

 

推荐阅读