pytest的一些关键点
一. pytest测试框架
1.单元测试:是指在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试。
java:junit,testng
python:unittest,pytest
2.自动化测试框架作用
①提高测试效率,降低维护成本
②减少人工干预,提高测试的准确性,增加代码的重用性
③核心思想是让不懂代码的人能够通过这个框架去实现自动化测试
3.pytest单元测试框架和自动化测试框架的关系:
①单元测试框架是自动化测试框架的组成部分之一;
②pom设计模式、数据驱动、关键字驱动、全局配置文件的封装、日志监控、断言、报告邮件等等
4.pytest简介
①pytest是一个非常成熟的python的单元测试框架,比unittest更灵活,容易上手;
②pytest可以和selenium,requests,appium结合实现web自动化、接口自动化,app自动化;
③pytest可以实现测试用例的跳过以及reruns失败用例重试;
④pytest可以和allure生成非常美观的测试报告;
⑤pytest可以和jenkins持续集成;
⑥支持用简单的assert语句实现丰富的断言;
⑦pytest有很多非常强大的插件,并且这些插件能够实现很多的实用的操作,插件:
pytest-html | 生成html格式的自动化测试报告 |
pytest-xdist | 测试用例分布式执行,多CPU分发 |
pytest-ordering | 用于改变测试用例的执行顺序 |
pytest-rerunfailures | 用例失败后重跑 |
allure-pytest | 用于生成美观的测试报告 |
pip install -U pytest |
8.pytest安装:pip install pytest,验证安装:pytest --version
9.pytest官方文档:https://doc.pytest.org/en/latest/
10.测试用例收集:
若未指定任何参数,收集从testpaths(如果已配置,在pytest.ini下定义testpath=xxx)或当前目录及其子目录开始。
11.assert断言:
assert 'xxxx' == yy [!=, <=, >=, not in, in , 判断是否为true,判断是否不为true]
12.参数化:
当一组测试用例有固定的测试数据时,就可以通过参数化的方式简化测试用例的编写。
通过pytest.mark.parametrzie()方法设置参数:
参数名:"user,pw,expected"用来定义参数的名称
参数值:通过数组定义参数值时,每一个元组都是一条测试用例的数据
ids参数:默认为none,用来重新定义测试用例的名称
@pytest.mark.parametrize( "user,pw,expected", [("xuzhu666","123456","xuzhu666,欢迎来到"), ("zz666","123456","zz666,欢迎来到")], ids=["case1","case2"]) def test_login(user,pw,expected): driver = webdriver.Chrome() driver.get('http://xxxxx') driver.find_element_by_lind_text("登录").click() driver.find_element_by_xpath("xxxxx").send_keys(user) driver.find_element_by_xpath("yyyyyy").send_keys(pw) driver.find_element_by_xpath("zzzzz").click() welcome = driver.find_element_by_xpath('xxxx').text assert expected == welcome
13.pytest常用参数:
参数 | 含义 | 使用方法 |
-s | 在终端执行测试时显示打印某些信息,比如print信息 | pytest -s |
-v | 显示详细信息 | pytest -v |
-k | 运行函数名称中包含某个字符串的测试用例,或⑤pytest -k "方法名" | pytest -k "one" |
-q | 执行测例时简化输出信息,比如..... | pytest -q |
-x | 如果出现一条测试用例失败,退出测试 | pytest -x |
运行测试目录 | pytest testpath/ | |
运行指定的类或方法,pytest path/test_xxx.py::函数名或类名 | pytest test_abc.py::test_a | |
collect-only | 查看测例数量 | pytest --collect-only |
--maxfail=num | 允许pytest失败几次后再停止 | pytest --maxfail=num |
-m | 使用固定marker来筛选用例 | |
--version | 查看版本 | pytest --version |
--fixtures | 显示可用的内置函数参数 | |
--help | 获取帮助 | |
--maxfail=num | 在第N个用例失败后,结束测试执行 | pytest --maxfail=2,出现2个失败就终止测试 |
pytest-rerunfailures | 重新运行失败用例 | pytest --reruns 3 --reruns-delay=5 |
14.多进程运行用例
安装插件 pytest-xdist:pip install pytest-xdist
运行模式:pytest -n NUMCPUS[调用多个CPU来执行测例]
import pytest def test_case01(): assert 1==1 def test_case02(): assert 1==2 def test_case03(): assert 1==1 def test_case04(): assert 1==4 def test_case05(): assert 1==1 def test_case06(): assert 1==5 if __name__ == '__main__': #将测试发送到多个CPU pytest.main(["-n", "2", "test_many.py"]) #使用与计算机具有的CPU内核一样多的进程来执行测例 pytest.main(["-n", "auto", "test_many.py"])
15.通过标记表达式执行用例
pytest -m slow 【这条命令会执行被装饰器@pytest.mark.slow装饰的所有测试用例】
def test_fail01(): print("第一次失败") assert 1==2 @pytest.mark.slow def test_fail02(): print("第二次失败") assert 2==3 @pytest.markk.slow def test_hello(): print("第三次执行成功") assert 1==1 if __name__=='__main__': pytest.main(["-s", "--maxfail=2", "test_fail2.py"]) #通过标记表达式执行 pytest.main(["-m","slow","test_rail2.py"]) #通过标记表达式执行,not slow pytest.main(["-m","not slow","test_rail2.py"])
16.pytest的setup/teardown 【类之外定义含义:】
①第一批次:setup_module/teardown_module:在当前文件中,在所有测试用例执行之前与之后执行
②第二批次:setup_function/teardown_function:在每个测试函数之前与之后执行
③第三批次:setup/teardown:在每个测试函数之前与之后执行,这2个方法同样适用于类方法
【在类里的定义含义:】
第一批次:setup_class/teardown_class: 在当前测试类的开始与结束时执行
第二批次:setup_method/teardown_method:在每个测试方法开始与结束时执行
第三批次:setup/teardown:在每个测试方法开始与结束时执行
17. pytest配置函数 pytest.ini
[pytest] #01 可添加多个命令行参数,用空格分隔 addopts = -s -v # 02 搜索文件夹,执行指定文件夹里的用例 testpaths = ./scripts # 03 配置搜索的文件名称,默认时搜索test开头的文件,改成以auto开通,以.py结尾的所有文件 python_files = auto*.py
18. pytest常用插件
①pytest-HTML插件,生成测试报告,安装方式:pip install pytest-html 使用方法:pytest --html=用户路径/report.html
②查看最慢的10个用例 pytest --durations=10
③关闭插件,比如关闭doctest pytest -p no:doctest
19 pytest之fixture
①定义:在测试中,fixture为测试提供了已定义的,可靠和一致的上下文。这可能包括环境(例如,通过已知的参数配置数据库)或内容(例如数据集)
我们可以通过装饰器@pytest.fixture来告诉pytest某个特定函数时一个fixture
【将方法first_fix作为参数传入到测试用例】
import pytest @pytest.fixture def first_fix(): return ['a'] def test_str(first_fix): #测试执行 first_fix.append('b') #断言 assert first_fix== ["a", "b“】 print(first_fix)
20. conftest.py
conftest.py是pytyest特有的本地测试配置文件,既可以用来设置项目级别的fixture,也可以用来导入外部插件。conftest.py文件名称是固定的,pytest会自动识别该文件,只作用于它所在的目录及子目录。