html5做图书馆网站,flash网站标题和网址,公司网站彩页怎么做,云台山旅游景区网站建设内容python-单元测试1 Unittest2 Pytest3 两者区别断言方面用例执行编写规则前后置操作setUp, setUpclass, setUpmodule 区别4 实战操作unittest:pytest:1 Unittest
unittest属于python的内置框架#xff0c;支持多种自动化测试用例的编写#xff0c;以及支持用例前置条件和后置…
python-单元测试1 Unittest2 Pytest3 两者区别断言方面用例执行编写规则前后置操作setUp, setUpclass, setUpmodule 区别4 实战操作unittest:pytest:1 Unittest
unittest属于python的内置框架支持多种自动化测试用例的编写以及支持用例前置条件和后置数据清理功能也可以将多个测试用例放在测试集中生成测试报告。 参考https://blog.csdn.net/weixin_53041251/article/details/124394128 2 Pytest
pytest也是基于python的一个单元测试框架是基于unittest的一个扩展框架比unittest更加简洁方便pytest最主要可以支持第三方插件内容可以更加高效的完成日常工作。而且pytest也支持unittest的代码框架内容。
3 两者区别
断言方面
Unittest 的断言是根据自身携带的断言内容提供了assertEqual, assertFalse, assertTrue 等。 pytest的断言就是根据Python自带的assert断言内容进行使用的
import pytestclass Test_o1:def test_o1(self):a gavinb gavin判断两个值是否相等assert a b判断a 是否在 b中assert a in b用例执行编写规则
unittest:
可以使用自定义测试类内容但必须继承unittest.TestCase的方法测试用例需要以test_开头的方法进行编写用例的执行顺序是根据ASCII的顺序进行执行的。unittest中提供了TestCase测试用例TestSuite测试套件)TestLoder加载用例TextTestRunner执行用例等方法让测试用例更加方便编写编写测试用例必须导入unittest模块执行用例必须带有unittest.main()参数。
pytest
测试文件名必须以test_开头的py文件或者以*_test.py结尾的py文件测试类名必须以Test开头测试用例必须以test_开头。Pytest可以进行执行unittest的用例pytest的执行顺序可以通过第三方插件进行定制顺序默认是通过从上往下的顺序进行执行。pytest的执行用例不需要导入模块。执行用例可以通过命令行的形式进行执行。
前后置操作
unittest
可以通过setup()和tearDown()的方法来控制用例的前后置操作并且每条用例执行前后都会执行前后置操作。通过setupclass()和teardownclass()方法来控制一个class下的所有用例都只执行1次前后置操作。
import unittestclass Test(unittest.TestCase):def setUp(self):print(unittest前置操作每次执行用例都会进行执行)def tearDown(self):print(unittest后置操作每次执行用例都会进行执行)classmethoddef setUpClass(cls):print(所有用例只执行一次前置操作)classmethoddef tearDownClass(cls):print(所有用例只执行一次后置操作)def test_01(self):print(用例01)def test_02(self):print(用例02)def test_03(self):print(用例03)if __name__ __main__:unittest.main()
frontend.py::Test::test_01
所有用例只执行一次前置操作
PASSED [ 33%]
unittest前置操作每次执行用例都会进行执行
用例01
unittest后置操作每次执行用例都会进行执行frontend.py::Test::test_02
PASSED [66%]
unittest前置操作每次执行用例都会进行执行
用例02
unittest后置操作每次执行用例都会进行执行frontend.py::Test::test_03
PASSED [100%]
unittest前置操作每次执行用例都会进行执行
用例03
unittest后置操作每次执行用例都会进行执行
所有用例只执行一次后置操作pytest
模块级别的前后置操作setup_moduleteardown_function表示模块下的测试用例只执行1次前后置操作。
import pytestdef setup_module():print(每次用例执行前只执行一次测试前置操作)def teardown_module():print(每次用例执行后只执行一次测试后置操作)def test01():print(用例01)def test02():print(用例02)def test03():print(用例03)if __name__ __main__:pytest.main([-vs])
frontendpytest.py::test01
每次用例执行前只执行一次测试前置操作
PASSED [ 33%]
用例01frontendpytest.py::test02
PASSED [ 66%]
用例02frontendpytest.py::test03
PASSED [100%]
用例03
每次用例执行后只执行一次测试后置操作import pytestpytest.fixture()
def login():print(测试用例前置操作)yieldprint(测试用例后置操作)class Test:def test01(self, login):print(用例01)def test02(self, login):print(用例02)def test03(self):print(用例03)if __name__ __main__:pytest.main([-vs])
通过执行发现我们在用例03中没有加入fixture所有他没有执行一些用例的前置和后置操作。
test_fixture.py::Test::test01
测试用例前置操作
PASSED [ 33%]
用例01
测试用例后置操作test_fixture.py::Test::test02
测试用例前置操作
PASSED [ 66%]
用例02
测试用例后置操作test_fixture.py::Test::test03
PASSED [100%]
用例03setUp, setUpclass, setUpmodule 区别 https://blog.csdn.net/qq_42792477/article/details/102833763 setUp: 类里面每个测试用例都会调用一遍 setUpclass: 类里面一个测试用例里面只执行一遍 setUpmodule: 类外面 提前创建好的内容之后调用
4 实战操作
unittest:
import unittestimport requestsimport HtmlTestRunner# from HTMLTestRunner import HTMLTestRunner
import ddt# 天气接口的参数化数据
from .HTMLTestRunner import HTMLTestRunnerdata [{city: 上海, key: 331eab8f3481f37868378fcdc76cb7cd, result: 查询成功!},{city: 上海, key: 331eab8f3481f37868378fcdc76cb7c,result: 错误的请求KEY},{city: 上, key: 331eab8f3481f37868378fcdc76cb7cd, result: 暂不支持该城市}]ddt.ddt
class Test_(unittest.TestCase):def tianqi(self, city, key):天气接口data {key: key,city: city}r requests.post(urlhttp://apis.juhe.cn/simpleWeather/query, datadata)return r.json()def shenfenzheng(self, cardno, key):身份证查询接口data {cardno: cardno,key: key}r requests.post(http://apis.juhe.cn/idcard/index, datadata)return r.json()ddt.data(*data)def test_01(self, data):参数化的天气接口x self.tianqi(citydata[city], keydata[key])self.assertEqual(x[reason], data[result])def test_02(self):正确的身份证号正确的keycardno 130428197411155947 # 身份证信息通过Faker随机创建key f40a75704fac353952a6534a18f9f437# 请求查询身份证接口a self.shenfenzheng(cardno, key)self.assertIn(a[reason], 成功的返回)unittest.skip(强制跳过不需要条件)def test_03(self):正确的身份证号错误的key跳过用例cardno 130428197411155947key f40a75704fac353952a6534a18f9f43a self.shenfenzheng(cardno, key)self.assertEqual(a[reason], 错误的请求KEY)unittest.skipIf(True, 条件成立时候进行跳过)def test_04(self):错误的身份证号正确的key跳过用例cardno 42082120031108929key f40a75704fac353952a6534a18f9f437a self.shenfenzheng(cardno, key)self.assertEqual(a[reason], 请输入正确的15或18位身份证)if __name__ __main__:unittest.main()# report_path report.html## # suite unittest.TestLoader().discover(./, test*.py)# # print(--------, suite)## # 以只写方式打开测试报告文件# fp open(# rC:\Users\zhihguo\PycharmProjects\Capgemini\Pytest_1\new_tests\test01.html,# wb)# # 实例化 HTMLTestRunner 对象 streamopen 函数打开的文件流 title[可选参数]为报告标题 description[可选参数]为报告描述信息比如操作系统、浏览器等版本# runner HTMLTestRunner(streamfp, title自动化测试报告, descriptionChrome 浏览器)# # 执行# # runner.run(suite)# # 关闭# # f.close()# ## testunit unittest.TestSuite()## # 加载用例## testunit.addTests(unittest.TestLoader().loadTestsFromTestCase(Test_))## # 执行用例## runner.run(testunit)## # 关闭报告## fp.close()# import unittest# from HTMLTestRunner import HTMLTestRunner## # # 生成测试套件# # suite unittest.TestLoader().discover(.\\, test*.py)# # 以只写方式打开测试报告文件# f open(rtest01.html, wb)# # 实例化 HTMLTestRunner 对象 streamopen 函数打开的文件流 title[可选参数]为报告标题 description[可选参数]为报告描述信息比如操作系统、浏览器等版本# runner HTMLTestRunner(streamf, title自动化测试报告, descriptionChrome 浏览器)# testunit unittest.TestSuite()## # 加载用例## testunit.addTests(unittest.TestLoader().loadTestsFromTestCase(Test_))# # 执行# runner.run(testunit)# # 关闭# f.close()pytest:
import requestsimport jsonimport pytest# 参数不同值# 天气接口的参数化数据data [({city: 上海, key: 331eab8f3481f37868378fcdc76cb7cd, result: 查询成功!}),({city: 上海, key: 331eab8f3481f37868378fcdc76cb7c, result: 错误的请求KEY}),({city: 上, key: 331eab8f3481f37868378fcdc76cb7cd, result: 暂不支持该城市})]class TestCase:def weather(self, city, key):url http://apis.juhe.cn/simpleWeather/query# 查询天气接口参数data {city: city,key: key}r requests.post(url, datadata)return r.json()def shenfenzheng(self, cardno, key):身份证查询接口data {cardno: cardno,key: key}r requests.post(http://apis.juhe.cn/idcard/index, datadata)return r.json()pytest.mark.parametrize(data, data)def test_01(self, data):# 调用天气预报接口r TestCase().weather(citydata[city], keydata[key])assert r[reason] data[result]def test_02(self):正确的身份证号正确的keycardno 130428197411155947 # 身份证信息通过Faker随机创建key f40a75704fac353952a6534a18f9f437# 请求查询身份证接口a self.shenfenzheng(cardno, key)assert a[reason] 成功的返回pytest.mark.skip(强制跳过不需要条件)def test_03(self):正确的身份证号错误的key跳过用例cardno 130428197411155947key f40a75704fac353952a6534a18f9f43a self.shenfenzheng(cardno, key)assert a[reason] 错误的请求KEYpytest.mark.skipif(True, reason条件成立时候进行跳过)def test_04(self):错误的身份证号正确的key跳过用例cardno 42082120031108929key f40a75704fac353952a6534a18f9f437a self.shenfenzheng(cardno, key)assert a[reason] in 请输入正确的15或18位身份证if __name__ __main__:pytest.main([-s])