https://blog.csdn.net/IT_LanTian/article/details/124133622
一、pytest单元测试框架
1.什么是单元测试框架?
单元测试是指在软件开发当中针对软件的最小单位(函数、方法)进行正确性的检查测试
2.单元测试框架有哪些?
Java:junit 和 testing
python:unittest 和 pytest
3.单元测试框架主要做什么?
1).测试发现:从多个文件里面去找到我们的测试用例
2).测试执行:按照一定的顺序和规则去执行,并生成结果
3).测试判断:通过断言判断预期结果和实际结果的差异
4).测试报告:统计测试进度、耗时、通过率、生成测试报告
二、单元测试框架和自动化测试框架有什么关系
1.什么是自动化测试框架?
把在自动化测试过程中用到的一些功能或者工具,分装成各个模块,包括如何进行自动化脚本编写以及分层功能的基础模块,进行持续集成、定时任务的管理模块,发送测试报告、进行测试结果统计分析的统计模块等,将这些模块组成一套可重用的骨架
2.作用
1)提高测试效率,降低维护成本
2)减少人工干预,提高测试的准确性,增加代码的重用性
3)核心思想是:让不懂代码的人也能够通过这个框架去实现自动化测试
3.pytest单元测试框架和自动化测试框架的关系
1)单元测试框架:只是自动化测试框架中的组成部分之一
2)pom设计模式:只是自动化测试框架中的组成部分之一
3)数据驱动、关键字驱动、全局配置文件的封装、日志监控、selenium,requests二次封装、断言、报告邮件等等
三、pytest简介
-
1).pytest是一个非常成熟的python的单元框架,比unittest更灵活,容易上手 2).pytest可以和selenium、requests、appium结合实现web自动化、接口自动化、app自动化 3).pytest可以实现测试用例的跳过以及reruns失败用例重试 4).pytest可以和allure生成非常美观的测试报告 5).pytest可以和Jenkins持续集成 6).pytest有很多非常强大的插件,并且这些插件能够实现很多的使用的操作 # 如: pytest pytest-html # (生成html格式的自动化测试报告) pytest-xdist # (测试用例分布式执行,多CPU分发) pytest-ordering # (用于改变测试用例的执行顺序) pytest-rerunfailures # (用例失败后重跑) allure-pytest # (用于生成美观的测试报告)
四、安装pytest
安装pytest:pip install pytest
五、pytest的命名规则
1).模块名必须以test_开头或者以test_结尾
2).测试类名必须以Test开头,并且不能有init方法
3).测试方法必须以test开头
六、pytest测试用例的运行方式和执行顺序
1.运行方式
-
1.主函数模式 1).运行所有:pytest.main() 2).指定模块:pytest.main(["test_01.py"]) 3).指定目录:pytest.main(["./test_py"]) 4).通过nodeid指定用例运行:nodeid有模块名、分隔符、类名、方法名、函数名组成 pytest.main(["test_01.py::Test01Class"]) # 指定到类名 pytest.main(["test_01.py::Test01Class::test003"]) # 指定到方法名 2.命令行模式 1).运行所有:pytest 2).指定模块:pytest test_01.py 3).指定目录:pytest ./test_py 4).通过nodeid指定用例运行:pytest test_01.py::Test01Class::test003 3.通过读取pytest.ini配置文件来运行 pytest.ini这个文件他是pytest单元测试框架的核心配置文件 1).位置:一般放在项目的根目录 2).编码:必须是ANSI,可以使用notepad++修改编码格式 3).作用:改变pytest默认的行为 4).运行规则:不管是主函数的模式运行,还是命令行模式运行,都会去读取这个配置文件
2.执行顺序
unittest:根据Ascll的大小来绝对的执行的顺序 pytest:默认从上到下 改变默认执行顺序:使用mark标记 @pytest.mark.run(order=3)
七、Pytest生成自带的html测试报告
安装pytest-html:
1.直接执行pytest.main() 【自动查找当前目录下,以test开头的文件或者以test结尾的py文件】
pytest.main([‘--html=./report.html’])
2.pytest.main("模块.py")【运行指定模块下,运行所有test开头的类和测试用例】
pytest.main(["--html=./report.html","模块.py"])
3.运行指定模块指定类指定用例,冒号分割,并生成测试报
pytest.main([‘--html=./report.html’,‘模块.py::类::test_a_001'])
4.Pytest调用语句
-
pytst.main(['-x','--html=./report.html','t12est000.py']) -x出现一条测试用例失败就退出测试 -s:显示print内容 -v:显示更详细的信息 -vs:这两个参数一起使用 -n:支持多线程或者分布式运行测试用例 -reruns NUM: 失败用例重跑 -x:只要有一个用例报错,那么测试停止 --maxfail=2:出现两个用例失败就停止 -k:根据测试用例的部分字符串指定测试用例
5.使用@pytest.mark.skip()跳过该用例(函数)
-
class Test01Class(): @pytest.mark.skip # 跳过test001 def test001(self): assert 5 == 4 # 断言
6.pytest运行结果字符意义
. 点号,表示用例通过
F 表示失败 Failure
E 表示用例中存在异常 Error
S 表示跳过 skipped
八、读取文件
1.读取csv文件
-
import csv #导入csv模块 class ReadCsv(): def read_csv(self): item =[] #定义一个空列表 c = csv.reader(open("../commonDemo/test1.csv","r")) #得到csv文件对象 for csv_i in c: item.append(csv_i) #将获取的数据添加到列表中 return item r = ReadCsv() print(r.read_csv()
具体步骤:
1.拿到开发的代码
-
class CalcClass(): def xf(self, a, b): c = a * b return c def cf(self, a, b): c = a / b return c # cc =CalcClass() # ff = cc.xf(1,2) # print(ff) # gg = cc.cf(1,2) # print(gg)
2.要测试的数据
2,3,6
3.读取CSV文件
-
import csv # 导入csv模块 class ReadCsv(): def read_csv(self): item = [] # 定义一个空列表 c = csv.reader(open("../dataDemo/a.csv", "r", encoding="utf-8")) # 得到csv文件对象 for csv_i in c: item.append(csv_i) # 将获取的数据添加到列表中 return item # r = ReadCsv() # print(r.read_csv())
4.测试用例+生成测试报告代码
-
""" from readDemo.readcsv import ReadCsv import pytest from demo.calcDemo import CalcClass import os import allure r = ReadCsv() rr = r.read_csv() c = CalcClass() class TestCsv(): def testcsv(self): for i in rr: bl = c.xf(int(i[0]), int(i[1])) assert bl == int(i[-1]) if __name__ == '__main__': pytest.main(["--html=./Csvreport.html", "test_csv.py"])
5.生成测试报告
读取xml文件
-
from xml.dom import minidom class Readxml(): def read_xml(self,filename,onename,twoname): root =minidom.parse(filename) firstnode =root.getElementsByTagName(onename)[0] secondnode=firstnode.getElementsByTagName(twoname)[0].firstChild.data return secondnode
九、allure
Allure是一款轻量级并且非常灵活的开源测试报告框架。它支持绝大多数测试框架, 例如TestNG、Pytest、JUint等。它简单易用,易于集成。
1.配置allure的环境变量
2.验证allure是否配置成功
3.安装allure
-
pip install allure-pytest
-
# allure-pytest是Pytest的一个插件,通过它我们可以生成Allure所需要的用于生成测试报告的数据
4.Allure常用的几个特性
-
@allure.feature # 用于描述被测试产品需求
-
@allure.story # 用于描述feature的用户场景,即测试需求
-
with allure.step():# 用于描述测试步骤,将会输出到报告中
-
allure.attach # 用于向测试报告中输入一些附加的信息,通常是一些测试数据,截图
5.具体效果
-
from readDemo.readcsv import ReadCsv import pytest from demo.calcDemo import CalcClass import os import allure r = ReadCsv() rr = r.read_csv() c = CalcClass() class TestCsv(): @allure.feature("两数相乘") # 用于描述被测试产品需求 @allure.story("乘除结果") # 用于描述feature的用户场景,即测试需求 def testcsv(self): with allure.step("查看乘法结果"): # 用于描述测试步骤,将会输出到报告中 allure.attach("6", "附加信息") # 用于向测试报告中输入一些附加的信息,通常是一些测试数据,截图等 for i in rr: bl = c.xf(int(i[0]), int(i[1])) assert bl == int(i[-1]) if __name__ == '__main__': pytest.main(['--alluredir', 'reportCsv/result', 'test_csv.py']) split = 'allure ' + 'generate ' + './reportCsv/result ' + '-o ' + './reportCsv/html ' + '--clean' # 将测试报告转为html格式 os.system(split) # system函数可以将字符串转化成命令在服务器上运行