ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

第十八:Pytest中的yield操作退出清理数据

第十八:Pytest中的yield操作退出清理数据

一.项目目录

二.yield关键字

1.它不是单独存在,要写在fixtrue标记的固件中。2.在声明的固件fixture中加入yield关键字,在它下面写测试用例,其他有关于固件的使用没有任何差别。3.fixture里面的teardown用yield来唤醒teardown的执行。4.如果测试用例中的代码出现异常或者断言失败,并不会影响它的固件中yield后的代码执行。但是如果固件中的yield之前的代码也就是相当于setup部分的带代码,出现错误或断言失败,那么yield后的代码将不会再执行,当然测试用例中的代码也不会执行。

三.fixture的作用域scope

1.scope=“function”

1.1.当pytest.fixture(scope="function")时,每个方法(函数)都会执行一次

test_yield_function.py

# 当pytest.fixture(scope="function") 时,每个方法(函数)都会执行一次。importpytest@pytest.fixture(scope="function")deflogin():print(u"登录成功")yieldprint(u"用例执行完成,收尾")deftest_one(login):print(u'操作1')deftest_two(login):print(u'操作2')deftest_three(login):print(u'操作3')if__name__=="__main__":pytest.main(["-s","test_yield_function.py"])#此时test1,test2,test3三个地方都调用了login函数,并且它会在每一个用例前执行一次。

1.2.如果test1不调用,test2调用login,test3不调用,运行顺序会是怎样的?

test_yield_function.py

importpytest@pytest.fixture(scope="function")deflogin():print(u"登录成功")yieldprint(u"用例执行完成,收尾")deftest_one():print(u'操作1')deftest_two(login):print(u'操作2')deftest_three():print(u'操作3')if__name__=="__main__":pytest.main(["-s","test_yield_function.py"])#function级别的fixture在用例test2调用前执行一次。

2.scope=“module”

2.1.fixture参数scope=”module”,module作用是整个.py文件都会生效( 整个文件只会执行一次),用例调用时,参数写上函数名称就行。

test_yield_module.py

# 当fixture参数scope=”module”,module作用是整个.py文件都会生效( 整个文件只会执行一次),用例调用时,参数写上函数名称就行。importpytest@pytest.fixture(scope="module")deflogin():print(u"登录成功")yieldprint(u"用例执行完成,收尾")deftest_one(login):print(u'操作1')deftest_two(login):print(u'操作2')deftest_three(login):print(u'操作3')if__name__=="__main__":pytest.main(["-s","test_yield_module.py"])

2.2.如果test1不调用,test2调用login,test3不调用,运行顺序会是怎样的?

test_yield_module.py

importpytest@pytest.fixture(scope="module")deflogin():print(u"登录成功")yieldprint(u"用例执行完成,收尾")deftest_one():print(u'操作1')deftest_two(login):print(u'操作2')deftest_three():print(u'操作3')if__name__=="__main__":pytest.main(["-s","test_yield_module.py"]#module级别的fixture只会在用例test2调用前执行一次。

三.yield执行teardown

1.fixture里面的teardown用yield来唤醒teardown的执行

test_yield_module_one.py

importpytest@pytest.fixture(scope="module")deflogin():print(u"登录成功")yieldprint(u"执行teardown!")print(u"用例执行完成,收尾")deftest_one(login):print(u'操作1')deftest_two(login):print(u'操作2')deftest_three(login):print(u'操作3')if__name__=="__main__":pytest.main(["-s","test_yield_module_one.py"])

四.yield遇到异常

1.如果其中一个用例出现异常,不影响yield后面的teardown执行,运行结果互不影响,并且在用例全部执行完之后,会呼唤teardown的内容。

test_yield_module_two.py

importpytest@pytest.fixture(scope="module")deflogin():print(u"登录成功")yieldprint(u"执行teardown!")print(u"用例执行完成,收尾")deftest_one(login):print(u'操作1')# 如果第一个用例异常了,不影响其他的用例执行raiseNameError# 模拟异常deftest_two(login):print(u'操作2')deftest_three(login):print(u'操作3')if__name__=="__main__":pytest.main(["-s","test_yield_module_two.py"])

2.如果在setup就异常,那么是不会去执行yield后面的teardown内容。

test_yield_module_three.py

importpytest@pytest.fixture(scope="module")deflogin():# 如果在setup就异常了,那么是不会去执行yield后面的teardown内容了assert1==2print(u"登录成功")yieldprint(u"执行teardown!")print(u"用例执行完成,收尾")deftest_one(login):print(u'操作1')# 如果第一个用例异常了,不影响其他的用例执行#raise NameError # 模拟异常deftest_two(login):print(u'操作2')deftest_three(login):print(u'操作3')if__name__=="__main__":pytest.main(["-s","test_yield_module_three.py"])


返回列表