单元测试之pytest

前提:需要安装 pytest pytest-html( 生成 html 测试报告)
pip install pytest pip install pytest-html

1:命名规则

Pytest 单元测试中的类名和方法名必须是以 test 开头 , 执行中只能找到 test 开头的类和方法,比 unittest
更加严谨
unittest Setup>> setupclass , teardown >> teardownclass (课堂作业)
Pytest: setup, setup_class teardown, teardown_class 函数 ( unittest 执行效果一样 )
运行于测试方法的始末,即 : 运行一次测试函数会运行一次 setup teardown
运行于测试方法的始末 , 但是不管有多少测试函数都只执行一次 setup_class teardown_class

2:Pytest生成自带的html测试报告

前提条件:需要下载pytest-html模块(python自带的生成测试报告模块)

pip install pytest-html

案例一

pytest.main("模块.py")【运行指定模块下,运行所有test开头的类和测试用例】

 生成报告

案例二

运行指定模块指定类指定用例,冒号分割,并生成测试报告

 输出报告:

案例三:

直接执行 pytest.main() 【自动查找当前目录下,以 test 开头的文件或者以 test 结尾的 py 文件】(pytest_test

生成报告:

 Pytest调用语句

输出报告: 

-x出现一条测试用例失败就退出测试

-s:显示print内容

扩充:跳过
使用 @pytest.mark.skip() 跳过该用例 ( 函数 )

 生成报告:

 3:Pytest的运行方式

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

4:读取xml文件

xml文件

 开发代码模块:

读取数据模块:

 测试代码模块:

生成报告:

实现代码:

#xml文件
<ento>
    <add>
        <add1>1</add1>
        <add2>2</add2>
        <denyu>3</denyu>
    </add>
</ento>

#开发代码
class Clac():
    def add(self,a,b):
        return a + b

    def jian(self,a,b):
        return a - b

#读取数据
from xml.dom import minidom

class ReadXml():
    def readxml(self,path,firsthod,secondnode):
        root = minidom.parse(path)
        firsthod = root.getElementsByTagName(firsthod)[0]
        secondnode = firsthod.getElementsByTagName(secondnode)[0].firstChild.data

        return secondnode

#测试代码
from readdata.readxml import ReadXml  #获取数据
from assets.clac import Clac  #引入开发代码
import pytest,allure,os
readxmlclass = ReadXml()
c = Clac()
aa = int(readxmlclass.readxml("../data/test.xml","add","add1"))
bb = int(readxmlclass.readxml("../data/test.xml","add","add2"))
cc = int(readxmlclass.readxml("../data/test.xml","add","denyu"))

class TestClass():

    def test001(self):
        result =  c.add(int(aa),int(bb))
        assert result == int(cc)

4.1读取csv文件

 开发代码模块:

读取数据模块:

 

 测试代码模块:

生成测试报告:

 实现代码:

#csv文件
10,20,30

#开发代码
class Clac():
    def add(self,a,b):
        return a + b

    def jian(self,a,b):
        return a - b

#读取数据
import csv
class CsvClass():
    def csvclass(self):
        item = []
        c = csv.reader(open("../data/test.csv"))
        for csv_i in c:
            item.append(csv_i)
        return item

r = CsvClass()
print(r.csvclass())

#测试代码
from readdata.redatacsv import CsvClass
from assets.clac import Clac
import pytest
r = CsvClass()
data = r.csvclass()
c = Clac()

class TestCsv():
    def test001(self):
        for item_i in data:
            result = c.add(int(item_i[0]),int(item_i[1]))
            assert result == int(item_i[2])

if __name__ == '__main__':
    pytest.main(["-s","test_02.py","--html=./report123.html"])

5:allure

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

验证allure是否配置成功

其次要安装allure

pip install allure-pytest

allure-pytestPytest的一个插件,通过它我们可以生成Allure所需要的用于生成测试报告的数据  

5.1Allure常用的几个特性

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

5.1.1:allure.feature

@allure.feature # 用于描述被测试产品需求

5.1.2:allure.story

@allure.story # 用于描述feature的用户场景,即测试需求

案例

实现用户登录功能,场景为登录成功和登录失败

 Pytestallure效果展示

读取xml生成allure报告

 开发代码:

读取数据:

 生成报告:

#xml文件
<ento>
    <add>
        <add1>1</add1>
        <add2>2</add2>
        <denyu>3</denyu>
    </add>
</ento>

#开发代码
class Clac():
    def add(self,a,b):
        return a + b

    def jian(self,a,b):
        return a - b

#读取数据
from xml.dom import minidom

class ReadXml():
    def readxml(self,path,firsthod,secondnode):
        root = minidom.parse(path)
        firsthod = root.getElementsByTagName(firsthod)[0]
        secondnode = firsthod.getElementsByTagName(secondnode)[0].firstChild.data

        return secondnode

#测试代码
from readdata.readxml import ReadXml  #获取数据
from assets.clac import Clac  #引入开发代码
import pytest,allure,os
readxmlclass = ReadXml()
c = Clac()
aa = int(readxmlclass.readxml("../data/test.xml","add","add1"))
bb = int(readxmlclass.readxml("../data/test.xml","add","add2"))
cc = int(readxmlclass.readxml("../data/test.xml","add","denyu"))

class TestClass():
    @allure.feature("加法判断功能") #用于定义被测试的功能,被测产品的需求点
    @allure.story("断言成功")       #用于定义被测功能的用户场景,即子功能点
    def test001(self):
        with allure.step("查看相加结果"):  #用于描述测试步骤,将会输出到报告中
            allure.attach("等于3","1加2")
        result =  c.add(int(aa),int(bb))
        assert result == int(cc)
    @allure.feature("等于判断功能")
    @allure.story("断言失败")
    def test002(self):
        assert 1==2

if __name__ == '__main__':
    pytest.main(['--alluredir', 'report/result', 'test_01.py'])  # 生成json类型的测试报告
    split = 'allure ' + 'generate ' + './report/result ' + '-o ' + './report/html ' + '--clean'  # 将测试报告转为html格式
    os.system(split)  # system函数可以将字符串转化成命令在服务器上运行

猜你喜欢

转载自blog.csdn.net/shitoureng/article/details/124276292
今日推荐