• 一文5000字详解Pytest单元测试,看完不会来打我【保姆级教程】


    一、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. 1).pytest是一个非常成熟的python的单元框架,比unittest更灵活,容易上手
    2. 2).pytest可以和selenium、requests、appium结合实现web自动化、接口自动化、app自动化
    3. 3).pytest可以实现测试用例的跳过以及reruns失败用例重试
    4. 4).pytest可以和allure生成非常美观的测试报告
    5. 5).pytest可以和Jenkins持续集成
    6. 6).pytest有很多非常强大的插件,并且这些插件能够实现很多的使用的操作
    7. # 如:
    8.     pytest
    9.     pytest-html # (生成html格式的自动化测试报告)
    10.     pytest-xdist # (测试用例分布式执行,多CPU分发)
    11.     pytest-ordering # (用于改变测试用例的执行顺序)
    12.     pytest-rerunfailures # (用例失败后重跑)
    13.     allure-pytest # (用于生成美观的测试报告)

    1. 现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
    2. 如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
    3. 可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
    4. 分享他们的经验,还会分享很多直播讲座和技术沙龙
    5. 可以免费学习!划重点!开源的!!!
    6. qq群号:110685036

    四、安装pytest

    安装pytest:pip install pytest

    五、pytest的命名规则

    1).模块名必须以test_开头或者以test_结尾
    2).测试类名必须以Test开头,并且不能有init方法
    3).测试方法必须以test开头

    六、pytest测试用例的运行方式和执行顺序

    1.运行方式

    1. 1.主函数模式
    2.     1).运行所有:pytest.main()
    3.     2).指定模块:pytest.main(["test_01.py"])
    4.     3).指定目录:pytest.main(["./test_py"])
    5.     4).通过nodeid指定用例运行:nodeid有模块名、分隔符、类名、方法名、函数名组成
    6.                    pytest.main(["test_01.py::Test01Class"]) # 指定到类名
    7.                    pytest.main(["test_01.py::Test01Class::test003"]) # 指定到方法名
    8. 2.命令行模式
    9.     1).运行所有:pytest
    10.     2).指定模块:pytest test_01.py
    11.     3).指定目录:pytest ./test_py
    12.     4).通过nodeid指定用例运行:pytest test_01.py::Test01Class::test003
    13. 3.通过读取pytest.ini配置文件来运行
    14. pytest.ini这个文件他是pytest单元测试框架的核心配置文件
    15.   1).位置:一般放在项目的根目录
    16.   2).编码:必须是ANSI,可以使用notepad++修改编码格式
    17.   3).作用:改变pytest默认的行为
    18.   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调用语句

    1. pytst.main(['-x','--html=./report.html','t12est000.py'])
    2. -x出现一条测试用例失败就退出测试
    3. -s:显示print内容
    4. -v:显示更详细的信息
    5. -vs:这两个参数一起使用
    6. -n:支持多线程或者分布式运行测试用例
    7. -reruns NUM: 失败用例重跑
    8. -x:只要有一个用例报错,那么测试停止
    9. --maxfail=2:出现两个用例失败就停止
    10. -k:根据测试用例的部分字符串指定测试用例

    5.使用@pytest.mark.skip()跳过该用例(函数)

    1. class Test01Class():
    2.     @pytest.mark.skip # 跳过test001
    3.     def test001(self):
    4.         assert 5 == 4  # 断言

    6.pytest运行结果字符意义

    . 点号,表示用例通过
    F 表示失败 Failure
    E 表示用例中存在异常 Error
    S 表示跳过 skipped

    八、读取文件

    1.读取csv文件

    1. import csv #导入csv模块
    2. class ReadCsv():
    3.     def read_csv(self):
    4.         item =[] #定义一个空列表
    5.         c = csv.reader(open("../commonDemo/test1.csv","r")) #得到csv文件对象
    6.         for csv_i in c:
    7.             item.append(csv_i) #将获取的数据添加到列表中
    8.         return item
    9.             
    10. r = ReadCsv()
    11. print(r.read_csv()

    具体步骤:

    1.拿到开发的代码
    
    1. class CalcClass():
    2.     def xf(self, a, b):
    3.         c = a * b
    4.         return c
    5.     def cf(self, a, b):
    6.         c = a / b
    7.         return c
    8. # cc =CalcClass()
    9. # ff = cc.xf(1,2)
    10. # print(ff)
    11. # gg = cc.cf(1,2)
    12. # print(gg)

    2.要测试的数据

    2,3,6

    3.读取CSV文件

    1. import csv # 导入csv模块
    2. class ReadCsv():
    3.     def read_csv(self):
    4.         item = [] # 定义一个空列表
    5.         c = csv.reader(open("../dataDemo/a.csv""r", encoding="utf-8")) # 得到csv文件对象
    6.         for csv_i in c:
    7.             item.append(csv_i) # 将获取的数据添加到列表中
    8.         return item
    9. # r = ReadCsv()
    10. # print(r.read_csv())

    4.测试用例+生成测试报告代码

    1. """
    2. from readDemo.readcsv import ReadCsv
    3. import pytest
    4. from demo.calcDemo import CalcClass
    5. import os
    6. import allure
    7. r = ReadCsv()
    8. rr = r.read_csv()
    9. c = CalcClass()
    10. class TestCsv():
    11.     def testcsv(self):
    12.         for i in rr:
    13.             bl = c.xf(int(i[0]), int(i[1]))
    14.             assert bl == int(i[-1])
    15. if __name__ == '__main__':
    16.     pytest.main(["--html=./Csvreport.html", "test_csv.py"])

    5.生成测试报告

    读取xml文件

    1. from xml.dom import minidom
    2. class Readxml():
    3.     def read_xml(self,filename,onename,twoname):
    4.         root =minidom.parse(filename)
    5.         firstnode =root.getElementsByTagName(onename)[0]
    6.         secondnode=firstnode.getElementsByTagName(twoname)[0].firstChild.data
    7.         return secondnode

    九、allure

    Allure是一款轻量级并且非常灵活的开源测试报告框架。它支持绝大多数测试框架, 例如TestNG、Pytest、JUint等。它简单易用,易于集成。

    1.配置allure的环境变量

    2.验证allure是否配置成功

    3.安装allure

    1. pip install allure-pytest
    2. # allure-pytest是Pytest的一个插件,通过它我们可以生成Allure所需要的用于生成测试报告的数据

    4.Allure常用的几个特性

    1. @allure.feature # 用于描述被测试产品需求
    2. @allure.story # 用于描述feature的用户场景,即测试需求
    3. with allure.step():# 用于描述测试步骤,将会输出到报告中
    4. allure.attach # 用于向测试报告中输入一些附加的信息,通常是一些测试数据,截图

    5.具体效果

    1. from readDemo.readcsv import ReadCsv
    2. import pytest
    3. from demo.calcDemo import CalcClass
    4. import os
    5. import allure
    6. r = ReadCsv()
    7. rr = r.read_csv()
    8. c = CalcClass()
    9. class TestCsv():
    10.     @allure.feature("两数相乘") # 用于描述被测试产品需求
    11.     @allure.story("乘除结果") # 用于描述feature的用户场景,即测试需求
    12.     def testcsv(self):
    13.         with allure.step("查看乘法结果"): # 用于描述测试步骤,将会输出到报告中
    14.             allure.attach("6""附加信息") # 用于向测试报告中输入一些附加的信息,通常是一些测试数据,截图等
    15.         for i in rr:
    16.             bl = c.xf(int(i[0]), int(i[1]))
    17.             assert bl == int(i[-1])
    18. if __name__ == '__main__':
    19.     pytest.main(['--alluredir''reportCsv/result''test_csv.py'])
    20.     split = 'allure ' + 'generate ' + './reportCsv/result ' + '-o ' + './reportCsv/html ' + '--clean'  # 将测试报告转为html格式
    21.     os.system(split) # system函数可以将字符串转化成命令在服务器上运行

    如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!  

  • 相关阅读:
    【工具使用】代码行数统计的方法汇总
    【MySQL索引学习】MySQL索引详细学习
    Shadowing Japanese (中上)Unit 3
    git commit message 规范
    6.1 Go语言中接口使用样例
    Qt QMultiMap
    node后端接收pdf接口
    oracle自启动的p***并行进程过多导致的process进程超限问题
    【GlobalMapper精品教程】023:Excel数据通过相同字段连接到属性表中(气温降水连接到气象台站)
    蓝桥杯打卡第14天
  • 原文地址:https://blog.csdn.net/qq_43371695/article/details/133746533