首页 > 技术文章 > Pytest测试框架介绍(2)

zhaikunkun 2020-03-27 21:12 原文

7.pytest框架结构——setup,teardown的使用

import pytest类似的setup,teardown同样更灵活

  • 模块级(setup_module/teardown_module)模块始末,全局的(优先级最高)
  • 函数级(setup_function/teardown_function)只对函数用例生效(不在类中)
  • 类级(setup_class/teardown_class)只在类中前后运行一次(在类中)
  • 方法级(setup_method/teardown_method)开始与方法始末(在类中)
  • 类里面的(setup/teardown)运行在调用方法的前后

可以通过这张图的运行结果去体会他们之间的关系:

8.前端自动化中应用——@pytest.fixture()

场景:测试用例执行时,有的用例需要登录才能执行,有些用例不需要登录。此时setup和teardown无法满足。fixture可以。默认scope(范围)function

用例1需要登录

用例2不需要登录

用例3需要登录

使用步骤:

  导入pytest

  在登录的函数上面加@pytest.fixture()

  在要使用测试方法中传入(登录函数名称),就先登录

  不传入的就不登录直接执行测试方法

如下图示例:

 

9.前端自动化中的应用-conftest

使用场景:你与其他测试工程师合作一起开发时,公共模块在不同文件中,要在大家都访问到的地方

解决:conftest.py这个文件进行数据共享,并且它可以放在不同位置起着不同的范围共享作用。

执行:系统执行到参数login时先从文本中查找是否有这个名字的变量,之后在conftest.py中找是否有

步骤:将登陆模块带@pytest.fixture()写在conftest.py

conftest.py配置需要注意:

  conftest.py文件名是不能换的⚠️⚠️

  conftest.py与运行的用例要在同一个package下,并且有__init__.py文件⚠️⚠️

  不需要import导入conftest.py,pytest用例会自动查找❗️

  全局的配置和前期工作都可以写在这里,放在某个包下,就是这个包数据共享的地方

如下图所示:放在同一个包下,有__init__文件,test_fix测试用例会首先去找本模块有没有登录函数,如果没有会自动去conftest.py文件下去查找 

 10.前端自动化中应用——yield

使用场景:你已经可以将测试方法前要执行的或依赖的解决了,测试方法运行后销毁清除数据的要如何进行呢?范围是模块级别的。类似setupclasss

解决:通过统一模块中加入yield关键字,yield是调用第一次返回结果,第二次执行它下面的语句返回

步骤:在使用@pytest.fixture(scope=module)

在登录的方法中加入yield,之后加销毁会清除的步骤注意,这种方式没有返回值,如果希望返回使用addfinalizer关键字

前面的语句相当于执行yield之前第一次调用的时候的操作,yield相当于一个return,等作用域用例执行完之后执行yield之后的操作

如下图所示:

查看scope源码可以看到scope范围可以为module、class、method、session;

运行结果如下:

 

 11.fixture的自动应用

场景:不想原测试方法有任何改动,或全部都自动实现自动应用,没特殊返回值时可以选择自动应用

解决:使用fixture中参数autouse=True实现

步骤:在方法上加@pytest.fixture(autouse=True)

在测试方法上加@pytest.mask.usefixtures("start")(这个使用目前暂无例子,先放这儿)

加了autouse=True,运行结果如下

 没有加autouse=True,运行结果如下:

 

推荐阅读