一、pytest单元测试框架介绍

针对软件最小单位 函数、方法 进行正确性的检查测试(针对用例进行测试)

干什么用的?

测试发现:从多个文件找到测试用例

测试执行:按照一定顺序和规则去执行,生成结果

测试判断:通过断言判断预期结果和实际结果的差异

测试报告:冲击测试进度、耗时、通过率、生成测试报告


二、单元测试框架和自动化测试框架有什么关系?

(1)自动化测试框架

提高测试效率较低维护成本,是封装的框架,基本不动了,就像回归用例。而且不懂代码也可以用

(2)单元测试框架

只是自动化测试框架组成部分之一

pom设计模式:只是自动化测试框架组成部分之一

数据驱动

关键字驱动

全局配置文件的封装

日志监控

断言

报告邮件

更多…


三、pytest简介

1.成熟框架、灵活、容易上手

2.可以和selenium、requests、applum结合实现web自动化,接口自动化、app自动化

3.可以实现失败用例重试,比如UI定位不准确,某一个元素加载不完全

4、可以和allure生成美观测试报告

5、可以和jenkind持续集成

6、有强大插件,可以实现生成使用的操作

pytest

pytest-html生成htnl自动化测试报告)

pytest-xdist 测试用例分布执行,多cpu多发,同时多个进程跑用例

pytset-ordering 改变测试用例执行顺序,按照我们的顺序去执行

pytest-rerunfailures 用例失败后重新跑

allure-pytest 用于生成美观的测试报告

7、PC使用:pytest下载成功后,需要在setting中对对应项目进行配置,在运行该项目下测试用例的时候需要选择使用对应的python版本


四、使用pytest默认的测试用例的规则和基础应用

1.模块名必须以test_开头或者以_test结尾

2.测试类必须以Test开头,并且不能有init方法

3.测试方法以test开头


五、pytest运行方式

1.主函数

(1)运行所有用例:pytest.main()

pytest-入门_python

test session starts测试开始 test_login.py .执行的 test_login.py文件,后面的.代表通过

如果我有多个用例,我需要每一个都要写一个main方法吗?

不用,单独写一个文件,把main方法移过去,其他用例里面就可以把main方法去除

all.py

import pytest

if __name__ == '__main__':
    # 输出调试信息
    pytest.main(['-s'])
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

test_produce.py

class Testproduct:
    def test_01_xinyao(selfself):
        print('妖媚')
  • 1.
  • 2.
  • 3.

test_login.py

class TestLogin:
    def test_01_baili(selfself):
        print('大大方方')

  • 1.
  • 2.
  • 3.

运行all.py结果:

============================= test session starts =============================
platform win32 -- Python 3.8.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\pythonProject
plugins: allure-pytest-2.9.43, forked-1.3.0, html-3.1.1, metadata-1.11.0, ordering-0.6, rerunfailures-10.1, xdist-2.3.0
collected 2 items

test_login.py 大大方方
.
test_produce.py 妖媚
.

============================== 2 passed in 0.04s ==============================

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

(2)运行指定(test_login.py)模块用例

    pytest.main(['-s', 'test_login.py'])
  • 1.

(3)运行指定函数

 pytest.main(['-s', './testcase/test_login.py::test_01_baili2'])
 #nodeid:./testcase/test_login.py::test_01_baili2
 #::分隔符
  • 1.
  • 2.
  • 3.

2.命令行模式

(1)pytest运行所有

pytest-入门_python_02

(2)指定模块

pytest -vs test_login.py
  • 1.

(3)指定用例

指定函数

D:\pythonProject>pytest -vs ./testcase/test_login.py::TestLogin

  • 1.

指定方法

if __name__ == '__main__':
    # 输出调试信息
    pytest.main(['-s', './testcase/test_login.py::TestLogin::test_01_baili'])
  • 1.
  • 2.
  • 3.

3.读取pytest.ini配置文件运行(常用、方便)

[pytest]
#addopts = -vs  --alluredir  ./temp
addopts = -vs
testpaths = ./dns/interfacetestcaseip
python_files =  *
python_classes = *
python_functions = test_*
markers =
    smoke:冒烟用例
    usermanage:用户管理模块
    user:用户管理模块Test
#interfacetestcase/test_03_dataexception.py
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

pytest.ini:pytest单元测试框架的核心配置文件

想执行用例分支下面的某个功能某块,就可以根据方法命名规则来区分想要执行的模块,对比标记执行顺序方便,不用一个个去标记,下次执行不一样的也不用大量单个更改

(1)位置:项目根目录

(2)编码格式:ANSI,可以使用notepad++修改编码格式

(3)作用:改变pytest的默认行为

(4)运行的规则:主函数和命令行都会去读取这个文件

[pytest]
#命令行的参数,用空格分隔
addopts = -vs

#测试用例路径
testpaths = ./testcase
#测试用例模块名规则
python_files = test*.py
#类名规则
python_classes = Test*
#方法名规则
python_functions = test
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

运行:

pytest -vs ./testcase

结果却是:

File "d:\python_ths\ths\lib\site-packages\iniconfig\__init__.py", line 82, in _parse
    for lineno, line in enumerate(line_iter):
UnicodeDecodeError: 'gbk' codec can't decode byte 0xb9 in position 63: illegal multibyte sequence

  • 1.
  • 2.
  • 3.

这是因为编码格式的问题

把文件copy出来,用notepad++打开——》中文删除-》编码-》转为ANSI编码格式,再次运行就OK

(5)指定分组执行(冒烟,分模块执行,分接口和web)

比如smoke:冒烟用例,分布在各个模块里面

那就在函数上方加一行

执行某个模块一部分用例和另一某块的一部分用例,那就可以用分组

@pytest.mark.smoke
  • 1.

然后再配置文件pytest.ini中加入

markers =
    smoke:冒烟用例
    usermanage:用户管理模块
  • 1.
  • 2.
  • 3.

第三步在命令行中执行:

D:\pythonProject>pytest -vs -m  "smoke"
  • 1.

如果我想同时执行冒烟分组和其他分组怎么办?

  1. 第一步在配置文件当中将标记的分组写进去
markers =
    smoke:冒烟用例
    usermanage:用户管理模块
    user:用户管理模块
  • 1.
  • 2.
  • 3.
  • 4.
  1. 第二步将想要分类到该分组的用例进行标记,标记语法为@pytest.mark.user
  2. 执行语句pytest -vx -m "smoke or user"