1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > pytest框架笔记(二) : 测试用例setup和teardown

pytest框架笔记(二) : 测试用例setup和teardown

时间:2024-05-09 19:03:09

相关推荐

pytest框架笔记(二) : 测试用例setup和teardown

一、用例运行级别

1、模块级:

开始于模块始末,全局的

setup_module:模块开始时执行

teardown_module:模块结束时执行

2、函数级

只对函数用例生效(不在类中)

setup_function:函数开始时执行

teardown_function:函数结束时执行

3、方法级

开始于方法始末(在类中)

setup_method:方法开始时执行

teardown_method:方法结束时执行

4、类里面的(setup/teardown)

运行在调用方法的前后,这个和unittest的setup/teardown作用相同

二、函数式

1、setup_function / teardown_function

pytest框架支持函数和类两种用例方式,先看函数里面的前置与后置用法:

1.1、setup_function / teardown_function 每个用例开始和结束调用一次

#!encoding=utf-8import pytestdef setup_function():print('setup_function:每个用例开始前都会执行')def teardown_function():print('teardown_function:每个用例结束后都会执行')def test_one():x="this"assert 'h' in xdef test_two():x='hello'assert hasattr(x,'check')def test_three():a='hello'b='hello world'assert a in bif __name__=="__main__":pytest.main('-s test_class002.py')

运行结果:

setup_function:每个用例开始前都会执行.teardown_function:每个用例结束后都会执行setup_function:每个用例开始前都会执行Ftest_class002.py:14 (test_two)def test_two():x='hello'> assert hasattr(x,'check')E AssertionError: assert FalseE + where False = hasattr('hello', 'check')test_class002.py:17: AssertionErrorteardown_function:每个用例结束后都会执行setup_function:每个用例开始前都会执行.teardown_function:每个用例结束后都会执行[100%]=================================== FAILURES ===================================___________________________________ test_two ___________________________________def test_two():x='hello'> assert hasattr(x,'check')E AssertionError: assert FalseE + where False = hasattr('hello', 'check')test_class002.py:17: AssertionError---------------------------- Captured stdout setup -----------------------------setup_function:每个用例开始前都会执行--------------------------- Captured stdout teardown ---------------------------teardown_function:每个用例结束后都会执行========================= 1 failed, 2 passed in 0.16s ==========================

1.2、从结果可以看出用例执行顺序:

setup_function-->用例1-->teardown_function

setup_function-->用例2-->teardown_function

setup_function-->用例3-->teardown_function

备注:-s参数是为了显示用例的打印信息,-q参数只显示结果,不显示过程

2、setup_module / teardown_module

2.1、setup_module是所有用例开始前只执行一次,teardown_module是所有用例结束后只执行一次

#!encoding=utf-8import pytestdef setup_module():print('setup_module:整个.py模型只执行一次')def teardown_module():print('teardown_module:整个.py模型只执行一次')def setup_function():print('setup_function:每个用例开始前都会执行')def teardown_function():print('teardown_function:每个用例结束后都会执行')def test_one():x="this"assert 'h' in xdef test_two():x='hello'assert hasattr(x,'check')def test_three():a='hello'b='hello world'assert a in bif __name__=="__main__":pytest.main('-s test_class002.py')

2.2、从运行结果可以看到setup_module和teardown_module执行了一次

setup_module:整个.py模型只执行一次setup_function:每个用例开始前都会执行.teardown_function:每个用例结束后都会执行setup_function:每个用例开始前都会执行Ftest_class002.py:20 (test_two)def test_two():x='hello'> assert hasattr(x,'check')E AssertionError: assert FalseE + where False = hasattr('hello', 'check')test_class002.py:23: AssertionErrorteardown_function:每个用例结束后都会执行setup_function:每个用例开始前都会执行.teardown_function:每个用例结束后都会执行teardown_module:整个.py模型只执行一次[100%]=================================== FAILURES ===================================___________________________________ test_two ___________________________________def test_two():x='hello'> assert hasattr(x,'check')E AssertionError: assert FalseE + where False = hasattr('hello', 'check')test_class002.py:23: AssertionError---------------------------- Captured stdout setup -----------------------------setup_function:每个用例开始前都会执行--------------------------- Captured stdout teardown ---------------------------teardown_function:每个用例结束后都会执行========================= 1 failed, 2 passed in 0.07s ==========================

备注:setup_fuction / teardown_function和setup_module / teardown_module 这四种方法是可以任意组合的,用一个和多个都可以

三、类和方法

1、setup / teardown和unittest里面的setup / teardown是一样的功能,setup_class和teardown_class等价于unittest里面的setupClass和teardownClass

#!encoding=utf-8import pytestclass TestCase:def setup(self):print('setup:每个用例开始前执行')def teardown(self):print('teardown:每个用例结束后执行')def setup_class(self):print('setup_class:所有用例执行之前执行')def teardown_class(self):print('teardown_class:所有用例执行之后执行')def setup_method(self):print('setup_method:每个用例开始前执行')def teardown_method(self):print('teardown_method:每个用例结束后执行')def test_one(self):x="this"assert 'h' in xdef test_three(self):a='hello'b='hello world'assert a in bif __name__=="__main__":pytest.main('-s test_class002.py')

运行结果

Testing started at 10:04 PM .../usr/local/bin/python3.6 /Applications/PyCharm.app/Contents/helpers/pycharm/_jb_pytest_runner.py --path /Users/luozelin/Desktop/pytest/pytest_demo/test_class002.pyLaunching py.test with arguments /Users/luozelin/Desktop/pytest/pytest_demo/test_class002.py in /Users/luozelin/Desktop/pytest/pytest_demo============================= test session starts ==============================platform darwin -- Python 3.6.3, pytest-5.1.2, py-1.8.0, pluggy-0.12.0rootdir: /Users/luozelin/Desktop/pytest/pytest_demoplugins: html-1.21.1, rerunfailures-7.0, metadata-1.8.0collected 2 itemstest_class002.py[100%]============================== 2 passed in 0.02s ===============================setup_class:所有用例执行之前执行setup_method:每个用例开始前执行setup:每个用例开始前执行.teardown:每个用例结束后执行teardown_method:每个用例结束后执行setup_method:每个用例开始前执行setup:每个用例开始前执行.teardown:每个用例结束后执行teardown_method:每个用例结束后执行teardown_class:所有用例执行之后执行Process finished with exit code 0

2、从结果可以看出,运行的优先级如下:

setup_class-->setup_method-->setup-->用例-->teardown-->teardown_method-->teardown_class

备注:这里setup_method和teardown_method的功能和setup / teardown的功能是一样的,一般二者用其一即可

四、函数和类混合

1、如果一个.py文件里面既有函数用例又有类和方法用例,运行顺序是怎样的?

#!encoding=utf-8import pytestdef setup_module():print('setup_module:整个.py模块只执行一次')def teardown_module():print('teardown_module:整个.py模块只执行一次')def setup_function():print('setup_function:每个用例开始前都会执行')def teardown_function():print('teardown_function:每个用例结束后都会执行')def test_one():x='this'assert 'h' in xdef test_two():x='hello'assert hasattr(x,'check')class TestCase:def setup_class(self):print('setup_class:所有用例执行之前执行')def teardown_class(self):print('teardown_class:所有用例执行之后执行')def test_three(self):x='this'assert 'h' in xdef test_four(self):x='hello'assert hasattr(x,'check')if __name__=="__main__":pytest.main('-s test_class003.py')

运行结果:

setup_module:整个.py模块只执行一次setup_function:每个用例开始前都会执行.teardown_function:每个用例结束后都会执行setup_function:每个用例开始前都会执行Ftest_class003.py:19 (test_two)def test_two():x='hello'> assert hasattr(x,'check')E AssertionError: assert FalseE + where False = hasattr('hello', 'check')test_class003.py:22: AssertionErrorteardown_function:每个用例结束后都会执行setup_class:所有用例执行之前执行.Ftest_class003.py:34 (TestCase.test_four)self = <test_class003.TestCase object at 0x112a37710>def test_four(self):x='hello'> assert hasattr(x,'check')E AssertionError: assert FalseE + where False = hasattr('hello', 'check')test_class003.py:37: AssertionErrorteardown_class:所有用例执行之后执行teardown_module:整个.py模块只执行一次[100%]=================================== FAILURES ===================================___________________________________ test_two ___________________________________def test_two():x='hello'> assert hasattr(x,'check')E AssertionError: assert FalseE + where False = hasattr('hello', 'check')test_class003.py:22: AssertionError---------------------------- Captured stdout setup -----------------------------setup_function:每个用例开始前都会执行--------------------------- Captured stdout teardown ---------------------------teardown_function:每个用例结束后都会执行______________________________ TestCase.test_four ______________________________self = <test_class003.TestCase object at 0x112a37710>def test_four(self):x='hello'> assert hasattr(x,'check')E AssertionError: assert FalseE + where False = hasattr('hello', 'check')test_class003.py:37: AssertionError--------------------------- Captured stdout teardown ---------------------------teardown_class:所有用例执行之后执行teardown_module:整个.py模块只执行一次========================= 2 failed, 2 passed in 0.08s ==========================

2、从运行结果看出,setup_module / teardown_module的优先级是最大的,然后函数里面用到的setup_function / teardown_function与类里面的setup_class / teardown_class互不干涉

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。