前提安装: pip install pytest
1.测试文件必须以test_开头或者test结尾(非耦合)
2.测试类名必须Test开头
3.测试用例必须以test_开头
夹具的差异
setup/teardown 在每个用例的前后执行
setup_class/teardown_class 在每个类的前后执行
setup_module/teardown_module 在每个模块的前后执行
断言的差异
python原生的assert
失败用例重跑差异
支持
参数化差异
@pytest.mark.parametrize()
1.新建一个类,必须继承unittest.TestCase(耦合)
2.导入unittest模块
3.测试用例必须以test_开头
setUp/tearDown 在每个用例的前后执行
setUpClass/tearDownClass 在每个类的前后执行
setUpModule/tearDownModule 在每个模块的前后执行
self.assertEqual()
不支持
ddt
TestCase 测试用例
TestSuite 测试套件:整理测试用例,形成一个集合
TestFixtrue 测试固件
TestLoader 测试加载器:加载测试用例套件或者测试用例
TestRunner 测试运行器:运行测试用例
为什么我们使用unittest.main()就可以执行所有的测试用例?
测试加载器已经初始化
通过测试加载器加载测试用例保存到self.test
创建文本测试运行器
最后通过 self.result=testRunner.run(self.test) 执行已经加载好的测试用例。并且吧结果放到self.result
module:测试用例所在的路径,__main__
代表当前模块
defaultTest:默认的待测试的测试用例或者测试套件的名称
argv:接收外部传递给程序的参数
testRunner:测试运行器
testLoader:测试加载器
exit:是否在测试用例结束之后退出程序
verbosity:显示详细信息的程度
<0 只显示用例总数以及全局执行结果
1 默认值,显示用例总数以及全局执行结果外,还显示一个标记:. F E S
>=2 显示用例总数以及全局执行结果,详细结果
运行方式有两种
1.命令行的运行方式。(unittest默认执行方式)
python -m unittest **.py
python -m unittest 模块名.类名
python -m unittest 模块名.类名.用例名
python -m unittest -v **.py
python -m unittest -v **.py -k *_baill
python -m 以命令行的方式运行测试用例
unittest -v 以详细的方式展示测试结果
-k 表示通过通配符匹配的方式去查找测试用例
2.main方式运行
if __name__=='__main__':
unittest.main()
、代表成功,如果加了-v,那么会变成OK
F代表用户失败
E:出错,有异常抛出
S:代表用例被跳过
ord() python的内置函数,返回ASCII码
根据ASCII的大小排序来执行测试用例
1.通过TestSuite加载多个测试用例的方式执行
import unittest
from test_api import TestApi
from test_web import TestWeb
if __name__ == '__main__':
#创建一个测试套件
suite=unittest.TestSuite()
#把测试用例加载到测试套件里边
testcases=[TestApi('test_mashang'),TestApi('test_01'),TestWeb('test_01')]
suite.addTest(testcases)
# suite.addTest(TestApi('test_mashang'))
# suite.addTest(TestApi('test_01'))
# suite.addTest(TestWeb('test_01'))
#执行时一定要指定套件
unittest.main(defaultTest='suite')
2.加载一个目录下所有测试用例
import unittest
if __name__=='__main__':
suite=unittest.defaultTestLoader.discover("./wen",pattern="test_*.py")`
unittest.main(defaultTest='suite')
setUp/tearDown 在每个用例的前后执行
setUpClass/tearDownClass 在每个类的前后执行
setUpModule/tearDownModule 在每个模块的前后执行
import unittest
class TestWeb(unittest.TestCase):
def setUp(self) -> None:
print("在每一个测试用例之前执行,打开浏览器,加载网页")
def tearDown(self) -> None:
print("在每个测试用例之后执行,关闭浏览器")
@classmethod
def setUpClass(cls) -> None:
print("在每个类之前执行,初始化日志对象,创建数据库连接")
@classmethod
def tearDownClass(cls) -> None:
print("在每个类之后执行,销毁日志对象,销毁数据库连接")
if __name__=='__main__':
unittest.main()
注意:
get请求通过params传递参数
post请求通过json或者data传参。他们的区别是什么?文件上传是通过files上传
data
数据报文:dict字典类型,那么默认情况下请求头:application/x-www-form-urlencoded,表示以form表单的方式传参,格式a=1&b=2&c=3
数据报文:str类型,那么默认情况下:text/plain
json
数据报文:不管是dict还是str类型,默认都是application/json,格式:{a:1,b:2}
json.dumps(data) 序列化 把字典格式转成字符串
json.loads(data) 反序列化 把str格式转换成字典格式
总结:
data只能传简单的只有键值对的dict或者str格式。json一般只能传dict格式(简单和嵌套都可以)