一、单元测试框架
1、什么是单元测试框架
单元测试是指在软件开发当中,针对软件的最小单位(函数、方法)进行正确性的检查测试。
2、单元测试框架
java:junit和testing
python:unittest和pytest
3、单元测试框架主要做什么?
1)测试发现:从多个文件里面去找到我们的测试用例
2)测试执行:按照一定的顺序和规划去执行,并产生结果
3)测试判断:通过断言判断预期结果和实际结果的差异
4)测试报告:统计测试进度,耗时,通过率,生成测试报告
二、Pytest简介
1.pytest是一个非常成熟的python单元框架,比unittest更灵活,容易上手。
2.pytest可以和selenium,requests,appnium结合实现web自动化,接口自动化,app自动化。
3.pytest可以实现测试用例的跳过以及request失败用例重试。
4.pytest可以和allure生成非常美观的测试报告。
5.pytest可以和jenkins持续集成。
6.pytest有非常强大的插件,并且这些插件能够实现很多实用的操作,如:
pytest-html(生成html格式的自动化测试报告)
pytest-xdist 测试用例分布式执行。多cpu分发
pytest-ordering 用于改变测试用例的执行顺序
pytest-rerunfailures 用于用例失败后重跑
allure-pytest 用于生成美观测试报告
三、使用pytest默认的规则
1.模块名必须以test_开头或者_test结尾
2.测试类必须以Test开头,并且不能有init方法。
3.测试方法必须以test开头
四、pytest测试用例的运行方式
1.主函数模式
1)运行所有 pytest.main()
2)运行指定模块 pytest.main(['-sv','test_product.py'])
3)指定目录:pytest.main(['-vs','./interface_testcase'])
4)通过nodeid指定用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成
pytest.main(['-vs','interface_testcase/test_interface.py::TestInterface::test_03_zzz'])(py文件中的某个类下面的某个方法)
2.命令行模式
1)运行所有:pytest
2)运行指定模块:pytest -sv test_product.py
3)运行指定目录: pytest -vs ./interface_testcase
4)通过nodeid指定用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成
pytest -vs interface_testcase/test_interface.py::test_04_func (py文件中的某个方法)
pytest -vs interface_testcase/test_interface.py::TestInterface::test_03_zzz(py文件中的某个类下面的某
个方法)
参数详解:
-s:表示输出调试信息,包括print打印的信息
-v:显示更详细的信息
-vs:两个参数可以一起
-n:支持多线程,分布式运行测试用例
>pytest -vs ./interface_testcase -n 2
--reruns num 失败用例重跑 (函数模式“=” --reruns=2)重跑两次 共计跑3次
-x 表示只要一个用例报错,测试停止
--maxfail=2 出现两个用力失败就停止
-k 根据测试用例的部分字符串指定测试用例
如:>pytest -vs ./interface_testcase -n 2 -k "aa",执行了包含了aa的用例
--html ./report/report.html :生成html测试报告
3.配置文件模式
通过读取pytest.ini配置文件运行
pytest.ini这个文件它是pytest单元测试框架的核心配置文件。
注意ini中最好不要写入中文,运行 会报错'gbk' codec can't decode byte 0x80 in position 92: illegal multibyte sequence
[pytest] addopts = -vs 命令行的参数 用空格分隔 testpashs = ./ 测试用例的路径 python_file = test_* 模块名规则 python_classes = Test 类名规则 python_functions = test 方法名规则
1)位置:一般放在项目的根目录
2)编码:必须是ANSI,可以使用notepad++修改编码格式
3)作用:改变pytest的默认行为
4)运行规则:不管是主函数的运行模式,还是命令行模式运行,都会去读取这个配置文件
五、pytest测试用例的执行顺序
1、pytest就是从上到下排序
改变默认的执行顺序,使用mark标记(run可以随便定义 也可以定义为smoke)
2、跳过测试用例
无条件跳过:
有条件跳过
六、Pytest框架实现一些前后置处理
1、setup/teardown,setup_class/teardown_class
class TestLogin: age =11 #在所有用例之前只执行一次 def setup_class(self): print("在每个类执行之前操作,比如创建日志对象、创建数据库链接、创建接口请求对象") def setup(self): print("在执行用例前执行前置操作") def test_01_baili(self): time.sleep(1) # assert 1==2 print('111111111111') @pytest.mark.skip(reason="就是不想执行该用例") def test_04_ff(self): print("ff") @pytest.mark.abc @pytest.mark.skipif(age>10,reason="已成年") def test_06_kk(self): print("kk") @pytest.mark.run(order=1) #第一个执行 def test_03_mm(self): print("mm") @pytest.mark.abc def test_05_pp(self): print("pp") def teardown(self): print("在执行测试用例后进行的后置操作") def teardown_class(self): print("在每个类执行之后操作,比如销毁日志对象、数据库链接、接口请求对象")
2、使用@pytest.fixture()装饰器来实现部分用例的前后置
@pytest.fixture(scope="",params="",autouse="",ids="",name="")
scope表示的是被@fixture标记的方法的作用域。function(默认),class,moudle,package/session.
params:参数化 (支持列表、元组、字典列表、字典元组) yield也相当于一个return
autouse=True:自动执行,默认False,自动每个用例都使用
ids:当使用params参数化时,给每一个值设置一个变量名。意义不大。
name:给表示的是被@pytest.fixture标记的方法取一个别名。
使用别名替换my_fixture,用例调用智能用别名
3、通过conconftest.py和@pytest.fixture()结合使用实现全局的前局的前置应用
比如:项目的前局登录、模块的前局处理、
1).conftest.py文件时单独存放的一个夹具,名称不可以被更改
2).用处可以在不同的py文件中使用同一个fixture函数
3).conftest.py需要和要执行的文件放在同一级,不需要进行import导入
三种前后置方法总结:
setup/teardown,setup_class/teardown_class 它是作用于所有用例或所有类
@pytest.fixture(),它的作用是既可以部分也可以前后置。
conftest.py和pytest.fixture()结合使用,作用于全局的前后置
七、pytest结合allure-pytest插件生成allure测试报告
pytest.html
allur-pytest
1、下载、解压、配置环境变量path路径
验证:allure --version
问题:dos验证通过,pycharm未通过,重启pycharm
2、生成json格式的临时报告
--alluredir ./temp
3、生成allure报告
os.system('allure generate ./temp -o ./report --clean')
allure generate 命令,固定的
./temp 临时的json格式报告的路径
-o 输出
--clean 清空原来的报告