在自动化测试中我们经常会针对某些测试方法编写前置测试数据,当测试方法执行完毕后再清理这些测试数据。之前我们接触的unittest框架中,使用setUp、tearDown方法来解决前置数据、后置数据销毁的问题。pytest为我们提供了更加强大灵活的fixtrue来完成该实现,本质上还是函数和装饰器的使用。

fixtrue基础使用

  • 该方法可任意命名没有setUp、tearDown的命名限制

  • 方法默认返回值是None,可配置返回值供测试方法使用

  • 该方法有执行范围,默认是function级别

下面是fixtrue的基础示例。

前置用例创建测试数据


  1. import pytest

  2. @pytest.fixture()

  3. def get_test_data():

  4. print("第一步:执行测试方法之前,会先调用我")

  5. return 1

  6. def test_assert_result(get_test_data):

  7. print("第二步:执行测试方法")

  8. assert 1 == get_test_data

  9. def test_assert_result2(get_test_data):

  10. print("第二步:执行测试方法")

  11. assert 1 == get_test_data


执行结果:

从上面的执行结果我们可以看到,每个测试方法执行前都会去先执行我们配置的前置方法来获取数据,这就是fixture最基本的作用。

配置多个fixture

  1. import pytest

  2. @pytest.fixture()

  3. def get_test_data():

  4. print("第一步:执行测试方法之前,会先调用我")

  5. return 1

  6. @pytest.fixture()

  7. def get_test_data2():

  8. print("第二个fixture配置:执行测试方法之前,会先调用我")

  9. return 2

  10. def test_assert_result(get_test_data, get_test_data2):

  11. print("第二步:执行测试方法")

  12. assert 1 == get_test_data

  13. assert 2 == get_test_data2

  14. def test_assert_result2(get_test_data):

  15. print("第二步:执行测试方法")

  16. assert 1 == get_test_data


执行结果:

我们为test_assert_result方法配置了2个前置方法,执行结果中可以看到成功接受了2个前置方法的返回结果。

后置数据销毁-yield


  1. import pytest

  2. @pytest.fixture()

  3. def get_test_data():

  4. print("第一步:执行测试方法之前,会先调用我")

  5. yield 1

  6. print("最后一步:执行数据清理操作")

  7. def test_assert_result(get_test_data):

  8. print("第二步:执行测试方法")

  9. assert 1 == get_test_data

  10. def test_assert_result2(get_test_data):

  11. print("第二步:执行测试方法")

  12. assert 1 == get_test_data


执行结果:

从执行结果上看每个方法都执行了最后一步的操作,在这里唯一需要注意的是返回值需要放在yield之后。

fixture作用域

通过scope参数我们可以指定作用域,前面我们也提到了默认情况下是function。

  • function 指每个测试函数都会去执行

  • class 指测试类只执行一次

  • module 指执行整个module文件时执行一次

  • session 指一次测试只执行一次

  1. import pytest

  2. @pytest.fixture(scope="function")

  3. def get_test_data():

  4. print("第一步:执行测试方法之前,会先调用我")

  5. yield 1

  6. print("最后一步:执行数据清理操作")

  7. @pytest.fixture(scope="class")

  8. def get_test_data():

  9. print("第一步:执行测试方法之前,会先调用我")

  10. yield 1

  11. print("最后一步:执行数据清理操作")

  12. @pytest.fixture(scope="module")

  13. def get_test_data():

  14. print("第一步:执行测试方法之前,会先调用我")

  15. yield 1

  16. print("最后一步:执行数据清理操作")

  17. @pytest.fixture(scope="session")

  18. def get_test_data():

  19. print("第一步:执行测试方法之前,会先调用我")

  20. yield 1

  21. print("最后一步:执行数据清理操作")

以上是fixture最基本的使用,大家可以在实际工作中实践应用。fixture还是很强大灵活的,那个测试方法需要就传递给那个方法,不需要的就不传递。fixture标记的方法也是支持参数传递的,赶快实践下吧!

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

更多推荐