pytest.org 为pytest的官网地址
安装 pip install pytest
文件以test_开头或_test结尾,类以Test开头,方法以test_开头。
git操作,在git上创建一个空的项目(没有readme),在gitbash中执行命令$ ssh-keygen -t rsa -C "你的邮箱" 不需要密码的情况下直接回车到生成成功本地pub证书,打开证书,将证书信息粘贴到git的ssh设置位置。在pycharm的terminal中执行git给的的git命令进行提交。
pytest --collect-only 只收集用例,观察执行用例的顺序
pytest -k "关键字" 执行带某些关键字的用例,"testcase" "add or div"
pytest xxx.py -vs 可以看到打印输出,否则pytest时不显示打印输出的。
@pytest.mark.login 可以自定义标签,还没在pytest.ini配置文件中添加该标签时,运行会出现告警错误。ini的内容为:[pytest] markers = login 换行 另外一个标签,使用pytest -m login 执行带该标签的用例
pytest --junitxml=./result.xml 可以生成一个测试结果的xml数据。
pytest --setup-show 回溯fixture的执行过程。
pytest --help 可以查看pytest命令的一些可用参数。
如果使用pytest执行,需要先在setting中进行pytest的配置,搜索pytest,将tools下面的选项选中pytest进行配置。
setup,teardown框架结构。在setup中进行实例化,需要在左边定义的实例对象加self.在后面的测试用例方法调用该实例也需要带self.实例名。这样就不需要在每个测试用例方法中都各实例化一次。在测试用例方法中实例化为a=b() b是一个在其他文件中定义的类,需要先导入该测试文件。有模块级(优先级最高),setup_module/teardown_module,函数级(不在类中),setup_function/teardown_function,类级setup_class/teardown_class,方法级运行于方法始末优先级高于单独的setup,setup_method/teardown_method,类里面的运行在调用方法的前后,setup/teardown ,fixture是类似于该框架的一个方式。
参数化:在方法或类上方加一个@pytest.mark.parametrize("字符串,多个用逗号隔开",[列表,多个列表就用方括号括起来,用逗号分隔])。可以在方法或类下的所有方法执行时引用参数。为了方便查看用例执行的名称,可以加ids=['对应前面的列表数量,中间逗号隔开']。参数化主要提取的是变化的数据,不变的数据不需要提取。当连续存在多个变量的参数化装饰器,会以笛卡尔积的形式,从内往外匹配生成多个参数化数据的完整组合。如果把数据放到yaml文件中,就是数据驱动的方式。
测试数据类型可以分类管理。浮点型数据因为二进制转换后会存在一些循环,如所以如果不做位数限制,就会无法校验成功。位数限制可以调用四舍五入方法round(算式或方法或变量,保留的位数)。小数转二级制的方法:小数乘二,看整数位。0.1的二进制就是0.00001100...
捕获异常,可以使用try: except Exception:来包住,Exception是会捕获所有异常的,如果要捕获某些特定类型的错误,需要对捕获的错误进行细分,如zeroxxx 是除数为0的具体错误。
yaml文件中,列表嵌套列表。可以有多种方式。读取yaml文件的方式 with open ("./datas/calc.yaml") as f: datas =yaml.safe_load(f) return datas
datas:
-
- 1
- 2
- [a,b]
ids:
- ['c','d']
需要先装yaml包,pip install pyyaml,多种安装方式都可。
fixture与setup teardown配置不同的是,可以单独引入,而不用多个同时引用。应用方法,@pytest.fixture(),可以传到普通方法,也可以传到fixture方法中,一个方法中可以传多个fixture。def 普通方法名(fixture方法名): 是直接使用方法名调用的方式。还有一种方法是@pytest.mark.usefixtures('login'),在测试用例前加装饰器,该方法在被应用方法有return值时,也不会返回返回值,不推荐使用。fixture在pytest上有用法介绍。@pytest.fixture()中可以带的参数有fixture方法、autouse参数不带默认为Flase,设置为True之后,就会在所有用例使用。作用域scope:session>module>class>function(默认)。pytest --setup-show xx.py可以看到fixture的实际使用情况。在fixture方法中使用yield,相当于return,有返回值,且还会执行teardown操作,即在yield后面的操作还会继续执行。
conftest.py 可以存储fixture方法,不需要导入就可以在测试文件中直接调用。该文件名固定不可改成其他的。放在项目下,是全局数据存储的地方。如果不同目录下有多个conftest.py文件,会先从近的找,近的没有,去父级目录找,不会找兄弟目录下的conftest。
fixture参数化,在fixture装饰器方法里面带params=[]参数,在fixture方法中调用request方法,调用request.param获取参数。还可以带ids=[]参数,用来对返回值进行用例名的格式化。fixture代替类的setup、teardown时,可以创建fixture方法,使用scope='class',并在方法中实例化对象,并使用yield 实例化对象进行对象的传递,在用例中,可直接调用该方法来调用类方法,而不需要使用self。fixture参数化是返回一个列表数据,索引列表下标可以取出列表中对应的数据。在测试类中,加载出该fixture,最终在测试类中的调用方式如下:
pytest插件
内置插件:pytest内置的 hook 函数
外部插件: 通过pip 安装的插件
本地插件: fixture 自定义的插件内容,放在 conftest.py 文件中,pytest 会自动的发现这些插件
pip install pytest-ordering 控制用例的执行顺序,在pytest上搜索后点击homepage进入github说明页,配合注释器@pytest.mark.second 或者@pytest.mark.run(order=1)等顺序参数使用。其中的hook函数pytest_collection_modifyitems(session,config,items)可以放到conftest中。用来自定义用例顺序,比如将方法应用的items:List 改为列表类型后,再使用items.reverse()来翻转列表顺序。还可以对用例集的字符进行转码。增加一个用例集的循环,并在循环内设置item.name=item.name.encode('utf-8').decode('unicode-escape'),item._nodeid=item.nodeid.encode('utf-8').decode('unicode-escape')python的external库的site_package下的pytest中有一个Hookspec文件,里面有所有的hook函数。可以通过源码https://github.com/ftobia/pytest-ordering/blob/develop/pytest_ordering/__init__.py中的item.add_marker(pytest.mark.run(order=order))方法来给方法打标签如item.add_marker(pytest.mark.foo)
item.nodeid=item.nodeiitem.nodeid.encode('utf-8').decode('unicode-escape')
pip install pytest-dependency 控制用例的依赖关系
pip install pytest-xdist 分布式并发执行测试用例 按照cpu核数随机分配用例给不同的核
pip install pytest-rerunfailures 失败重跑
pip install pytest-assume 多重校验 使所有断言都被执行(正常碰到断言失败就会停止)
pip install pytest-radom-order 用例随机执行
pip install pytest-html 测试报告
如果需要被引用,则package下需要有init文件。
allure测试报告生成
安装java 环境 建议jdk 1.8版本
allure 下载地址:Central Repository: io/qameta/allure/allure-commandline/2.13.8 1 安装 allure环境,配置bat文件所在地址为环境变量
安装 allure-pytest库 pip install allure-pytest
Allure help 帮助文档
生成 allure 测试结果 :pytest --alluredir=./report/
展示报告:allure serve ./report
生成最终版本的报告: allure generate ./report
在本地搭建一个网站服务(例如:Django)
python manage.py runserver (http://127.0.0.1:8000/ 2)
@allure.feature("大分类名")
@allure.story("小类别名")
pytest.ini文件,通过pytest --help查看pytest.ini的一些配置信息。注释使用分号开头,在文件中加入python_files = 需要自定义被收集的用例文件名(不用带引号,多个值,中间用空格隔开)。其他还有日志、addopts = -vs --alluredir=./result --clean-alluredir等命令行参数的默认值。