接口自动化测试——用例管理框架(单元测试框架)—pytest

642 阅读7分钟

一、pytest是什么

pytest:python的第三方框架,需要先安装后使用。用于接口自动化测试的用例管理框架

pip install pytest

python:unittest / pytest

java: junit / testng

二、作用

1.发现用例:根据每个框架默认的规则发现并且加载测试用例

2.执行用例:将测试用例按照一定的顺序和条件执行,并生成结果

3.判断结果:通过断言来判断实际结果和预期结果是否相同

4.生成报告:统计测试进度、耗时、通过率、生成报告

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

1、pytest单元测试框架只是自动化测试框架的组成部分之一。(pytest解决了用例层面的问题)

pytest参数化

image.png

2、pom设计模式也是自动化测试框架的组成部分之一。(pom解决页面层面的问题)

Page Object Model:页面对象 设计模式

  • 使用对象代表页面
  • 使用对象的属性代表页面的元素
  • 使用对象的方法代表页面的操作

定义过程:

  • 1、定义BasePage(抽象类)

image.png

  • 2、定义Page(页面类)
  • 3、定义元素的交互(对象方法)

image.png

使用过程:

  • 1、打开页面,实例化Page
  • 2、调用Page方法,完成交互

image.png

好处:

  • 1、使用POM测试用例非常简洁
  • 2、封装了BasePage,元素定位非常简单
  • 3、封装Page,相似的交互动作,不用写重复的代码

web封装日志和截图:

定位前截图

image.png

定位后截图

image.png

3、自动化测试框架还包括

数据驱动、关键字驱动、全局配置文件的封装、日志监控 selenium,requests二次封装、断言、报告邮件、等等

4、什么是自动化测试框架

自动化测试组长针对一个项目开发的一个代码框架,这个框架封装了很多基础模块,报告模块等等

  • 作用?

      ① 提高测试效率,降低自动化用例的维护成本
      ② 减少人工的干预,提高测试的准确性,增加代码的重用性
      ③ 核心思想是让不懂代码的人也能通过这个框架去实现自动化
    

四、pytest

1、pytest简介

1、是一个非常成熟的python用例测试框架,它可以和selenium,requests,appium分别实现web自动化、接口自动化、app自动化

2、可以实现测试用例的跳过以及reruns失败用例重试

3、它可以和allure结合生成美观的报告以及和Jenkins实现持续集成

4、最重要的是,它有很多插件

pytest-html:生成html报告插件
pytest-xdist:多线程,测试用例分布式执行,多cpu分发
pytest-ordering:标记测试用例的执行顺序(默认从上到下)
pytest-rerunfailuers:失败用例重跑
pytest-base-url:管理基础路径
allure-pytest:生成allure报告
requests
pytest (查看版本:pytest --version)	
pyyaml

使用requirements.txt 文件保存插件,并通过命令:pip install -r requirements.txt安装

2、基于pytest单元测试框架,默认测试用例的规则

1.模块名(.py文件)必须以test_开头或_test结尾
2.类名必须Test开头
3.用例名必须以test_开头

这个规则是为了让pytest能找到你的用例,是寻找用例的一种机制

3、pytest测试用例的运行方式

① 主函数模型

在if name == 'main':主函数中

1、运行所有模块

 pytest.main()

2、指定模块

pytest.main(['-vs','test_login.py'])

3、指定目录

pytest.main(['-vs','./interface_testcase'])

4、通过nodeid指定用例运行:nodeid由模块名,分隔符,类名、方法名或函数名组成

① 模块名+分隔符(::)+函数名
pytest.main(['-vs','./interface_testcase/test_interface.py::test_02_func'])
② 模块名+分隔符(::)+类名+方法名
pytest.main(['-vs','./interface_testcase/test_interface.py::TestLogin::test_01_zhixing'])

② 命令行模式

在终端运行

1、运行所有模块

pytest

2、指定模块

pytest -vs test_login.py

3、指定目录

pytest -vs ./interface_testcase

4、指定用例运行

pytest -vs ./interface_testcase/test_interface.py::test_02_func

③ 运行时参数详解

1、-s:表示输出调试信息,包括print打印的信息

2、-v:显示更详细的信息

3、-vs:常一起使用

4、-n:支持多线程或者分布式运行

   如:终端方式:
      pytest -vs ./testCase -n 2
   主函数方式:
      pytest.main(['-vs','./testCase','-n=2'])

5、-reruns NUM: 失败用例重跑

终端:
     pytest  -vs ./testCase/test_login.py --reruns 2
主函数:    
    pytest.main(['-vs','./testCase','--reruns=2'])

6、-x:表示只要一个用例报错,那么测试停止

 终端命令行:
    pytest  -vs ./testCase/test_login.py -x

 主函数:
    pytest.main(['-vs','./testCase','-x'])

7、--maxfail=2(NUM) :出现两个用例失败就停止

    终端:
      pytest  -vs ./testCase/test_login.py --maxfail=2

8、-k:根据测试用例的部分字符串指定测试用例

    终端:
      pytest  -vs ./testCase/test_login.py -k "11"

9、--html ./report/report.html:生成html的测试报告

④ 通过读取pytest.ini配置文件运行(是pytest单元测试框架的核心配置文件)

1、位置:一般放在项目的根目录

2、编码:必须是ANSI,可以使用notepad++修改编码格式

[pytest]
addopts = -vs # 命令行的参数,用空格分隔
testpaths = ../testCase # 测试用例的路径
python_files = test_*.py # 模块名的规则
python_classes=Test* # 类名的规则
python_functions = test # 方法名的规则
makers = smoke:冒烟测试
               usermanage:用户管理模块
               productmanage:商品管理模块

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

4、运行的规则:不管是主函数的模式运行,还是命令行模式运行,都会去读取这个配置文件

image.png

4、pytest执行测试用例的顺序是怎样

unittest:按照ASCII码的大小来决定执行的顺序

pytest:默认从上到下改变默认的执行顺序:使用mark标记

@pytest.mark.run(order=1)

5、如何分组执行(冒烟、分模块执行,分接口和web执行)

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

image.png

image.png

冒烟用例——终端输入

pytest -vs -m "smoke"

pytest -vs -m "smoke or usermanage"

6、pytest跳过测试用例

① 无条件跳过

 @pytest.mark.skip(reason="不需要测试登录接口1")

② 有条件跳过

age = 18
@pytest.mark.skipif(age>=18,reason='已成年')

image.png

7、pytest框架实现一些前后置(固件,夹具)的处理,常用三种

1、setup/teardown, setup_class/teardown_class

注意:和unittest不一样,全是小写

image.png

2.使用fixture装饰器来实现部分用例or全部用例的前后置(更灵活)

装饰器:@pytest.fixture(scope="",params="",autouse="",ids="",name="")
scope:作用域
	function(函数,用例,默认)
	class:类
	module:模块
	package/session   :会话
params:参数化
	支持列表[ ]、元组( )、字典列表[{ },{ },{ }]、字典元组( { },{  },{ } )
	
		

image.png

	params = ['成龙',,'甄子丹','李四'],这里的params是参数名,有s
	request.param 这里是属性名,是没有s的
            

image.png

	同时有前后置,又得到相应的值
		
autouse=True:自动执行,默认False
ids:当使用params参数化时,给每个值设置一个变量名,意义不大
	

image.png

image.png

name:给表示的是被@pytest.fixture标记的方法取一个别名,当取了别名之后,原来的名称就用不了了

image.png

3.通过conftest.py和@pytest.fixture( )结合使用实现全局的前置应用(比如:项目的全局登录,模块的全局处理)

1.conftest.py文件是单独存放的一个夹具配置文件,名称是不能更改的
2.用处可以在不同的py文件中使用同一个fixture函数
3.原则上conftest.py需要和运行的用例放到统一层,并且不需要做任何的import导入的操作

    

image.png

image.png

总结

1、setup/teardown,setup_class/teardown_class它是作用于所有用例或者所有的类

2、@pytest.fixture()它的作用既可以部分也可以全部前后置

3、confest.py和@pytest.fixtrue( )结合使用,作用于全局的前后置

8、pytest结合allure-pytest插件生成allure测试报告

之前:pytest-html
现在:allure-pytest

1.下载,解压,配置path路径

    https://github.com/allure-framework/allure2/releases
    系统变量中配置path路径:D:\Neo4j\allure-2.18.1\allure-2.18.1\bin
    验证:allure --version
            1. cmd,dos命令
            2. pytcharm命令行(失败就重启)
                    

2.加入命令生成json格式的临时报告

	--alluredir ./temp
	

image.png

3.生成allure报告

os.system('allure generate ./temp -o ./report --clean')

 allure generate 命令,固定的
 ./temp            临时的json格式报告的路径
 -o                   输出output
 ./report          生成的allure报告的路径
 --clean           情况这个目录下的所有内容
	

image.png

image.png