前提:需要安装
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-pytest是Pytest的一个插件,通过它我们可以生成Allure所需要的用于生成测试报告的数据
5.1:Allure常用的几个特性
@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的用户场景,即测试需求
案例
实现用户登录功能,场景为登录成功和登录失败
Pytest和allure效果展示
读取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函数可以将字符串转化成命令在服务器上运行