pytest-单元测试框架

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest-单元测试框架相关的知识,希望对你有一定的参考价值。

参考技术A 针对软件的最小单位(函数、方法)进行测试

1、测试发现:从多个文件中找到我们的测试用例
2、测试执行:按照一定的顺序和规则执行,并生成结果
3、测试判断:通过断言判断实际结果和预期结果的差异
4、测试报告:统计测试进度、耗时、通过率,生成测试报告

PS:
(1)在项目下新建requirements.txt。将需要的插件一行一行输入
(2)打开pycharm下的terminal,然后敲入 pip install -r requirements.txt

一个all.py文件 可以执行test打头的所有模块测试用例
参数说明

软件测试人必须要会的——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).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::test0033.通过读取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:     pip install 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.生成测试报告"""

在这里插入图片描述
2.读取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函数可以将字符串转化成命令在服务器上运行

最后:【可能给予你助力的教程】

在这里插入图片描述
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

关注我的微信公众号:【程序员二黑】免费获取~

我的学习交流群:642830685 群里有技术大牛一起交流分享~

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

推荐阅读

高薪程序员也躲不过35岁这一关…当能力与年龄脱节,我们该如何自救

大学毕业开始销售…不甘于现状,转行测试的自救之路

从销冠到失业,最后选择软件测试,回头看看这段路,我很幸运!

以上是关于pytest-单元测试框架的主要内容,如果未能解决你的问题,请参考以下文章

python单元测试框架——pytest

python单元测试pytest

Selenium3自动化测试38单元测试Pytest

pytest-单元测试框架

Python接口自动化测试之pytest与unittest区别

Python接口自动化测试之pytest与unittest区别