unittest属于python的内置框架,支持多种自动化测试用例的编写,以及支持用例前置条件和后置数据清理功能也可以将多个测试用例放在测试集中生成测试报告。
参考:https://blog.csdn.net/weixin_53041251/article/details/124394128
pytest也是基于python的一个单元测试框架,是基于unittest的一个扩展框架,比unittest更加简洁,方便,pytest最主要可以支持第三方插件内容,可以更加高效的完成日常工作。而且pytest也支持unittest的代码框架内容。
Unittest 的断言是根据自身携带的断言内容,提供了assertEqual, assertFalse, assertTrue 等。
pytest的断言就是根据Python自带的assert断言内容进行使用的
import pytestclass Test_o1:def test_o1(self):a = 'gavin'b = 'gavin''''判断两个值是否相等'''assert a == b'''判断a 是否在 b中'''assert a in b
unittest:
pytest:
unittest:
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:
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 pytest@pytest.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%]
用例03
https://blog.csdn.net/qq_42792477/article/details/102833763
setUp: 类里面,每个测试用例都会调用一遍
setUpclass: 类里面,一个测试用例里面只执行一遍
setUpmodule: 类外面, 提前创建好的内容,之后调用
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(url='http://apis.juhe.cn/simpleWeather/query', data=data)return r.json()def shenfenzheng(self, cardno, key):'''身份证查询接口'''data = {"cardno": cardno,"key": key}r = requests.post('http://apis.juhe.cn/idcard/index', data=data)return r.json()@ddt.data(*data)def test_01(self, data):'''参数化的天气接口'''x = self.tianqi(city=data['city'], key=data['key'])self.assertEqual(x['reason'], data['result'])def test_02(self):'''正确的身份证号正确的key'''cardno = '130428197411155947' # 身份证信息通过Faker随机创建key = "f40a75704fac353952a6534a18f9f437"# 请求查询身份证接口a = self.shenfenzheng(cardno, key)self.assertIn(a['reason'], '成功的返回')@unittest.skip('强制跳过,不需要条件')def test_03(self):'''正确的身份证号错误的key(跳过用例)'''cardno = '130428197411155947'key = "f40a75704fac353952a6534a18f9f43"a = self.shenfenzheng(cardno, key)self.assertEqual(a['reason'], '错误的请求KEY')@unittest.skipIf(True, '条件成立时候,进行跳过')def test_04(self):'''错误的身份证号正确的key(跳过用例)'''cardno = '42082120031108929'key = "f40a75704fac353952a6534a18f9f437"a = 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(# r"C:\Users\zhihguo\PycharmProjects\Capgemini\Pytest_1\new_tests\test01.html",# "wb")# # 实例化 HTMLTestRunner 对象 stream:open 函数打开的文件流; title:[可选参数],为报告标题; description:[可选参数],为报告描述信息;比如操作系统、浏览器等版本;# runner = HTMLTestRunner(stream=fp, title="自动化测试报告", description="Chrome 浏览器")# # 执行# # 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(r"test01.html", "wb")# # 实例化 HTMLTestRunner 对象 stream:open 函数打开的文件流; title:[可选参数],为报告标题; description:[可选参数],为报告描述信息;比如操作系统、浏览器等版本;# runner = HTMLTestRunner(stream=f, title="自动化测试报告", description="Chrome 浏览器")# testunit = unittest.TestSuite()## # 加载用例## testunit.addTests(unittest.TestLoader().loadTestsFromTestCase(Test_))# # 执行# runner.run(testunit)# # 关闭# f.close()
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, data=data)return r.json()def shenfenzheng(self, cardno, key):'''身份证查询接口'''data = {"cardno": cardno,"key": key}r = requests.post('http://apis.juhe.cn/idcard/index', data=data)return r.json()@pytest.mark.parametrize('data', data)def test_01(self, data):# 调用天气预报接口r = TestCase().weather(city=data['city'], key=data['key'])assert r['reason'] == data['result']def test_02(self):'''正确的身份证号正确的key'''cardno = '130428197411155947' # 身份证信息通过Faker随机创建key = "f40a75704fac353952a6534a18f9f437"# 请求查询身份证接口a = self.shenfenzheng(cardno, key)assert a['reason'] == '成功的返回'@pytest.mark.skip('强制跳过,不需要条件')def test_03(self):'''正确的身份证号错误的key(跳过用例)'''cardno = '130428197411155947'key = "f40a75704fac353952a6534a18f9f43"a = self.shenfenzheng(cardno, key)assert a['reason'] == '错误的请求KEY'@pytest.mark.skipif(True, reason='条件成立时候,进行跳过')def test_04(self):'''错误的身份证号正确的key(跳过用例)'''cardno = '42082120031108929'key = "f40a75704fac353952a6534a18f9f437"a = self.shenfenzheng(cardno, key)assert a['reason'] in '请输入正确的15或18位身份证'if __name__ == '__main__':pytest.main(['-s'])