复习补充
目前,一部分公司使用unittest,一部分使用pytest。但是,pytest明显具有优势。
复习补充unittest框架pytest运行规则pytest -m add -v -s pytest_Terminal.py
执行mark标记为add的测试用例pytest --junit-xml ./result pytest_Terminal.py
pytest-ordering插件@pytest.mark.run(order=序号)pytest .ini文件【待补充】导出依赖包浮点型的精度问题 Decimal( )yaml用法将数据存到add.yml文件中,读取文件从而获取数据将方法名封装在steps.yml中,读取文件内容。pytest.fixture用法 fixture非常适合存放测试数据,并且他可以返回任何数据fixture中重要的:yield关键字
unittest框架
unittest框架是系Python自带的测试框架。在使用unittest是时,需要继承Unittest.TestCase.
同时,需要注意:unittest框架中的测试类运行,需要补充上:
if __name__ == '__main__':
unittest.main()
使用unittest时,产生测试报告:unittest+HTMLTestRunner
python3.5以后,有一个类型提示Type hints
"""我们期待a是int型,b是int型,同时该方法的返回值也是int"""
def add(self, a:int, b:int) ->int:
return a + b
Python的入口:if __name__ == '__main__':
pytest运行规则
pytest 收集所有以test*.py文件,Test开头的类,和以test开头的函数和方法,都能识别成测试用例
常用参数:
-k : 满足表达式的都会执行
pytest -k 'add'
执行包含add的测试用例
pytest -k 'add' or 'div'
执行包含add和div的测试用例
只负责收集测试用例
pytest --collect-only pytest_Terminal.py
收集pytest_Terminal.py文件中的测试用例
pytest --collect-only
收集当前目录下的测试用例
-m:加标签。执行前为用例加@pytest.mark.标签名
import pytest
from python.demo import Calc
class TestClac1:
#统一放在setup里面初始化
def setup(self):
self.calc = Calc()
@pytest.mark.add
def test_add(self):
result = self.calc.add(1,2)
print(result)
assert 3 == result
@pytest.mark.add
def test_add_1(self):
result = self.calc.add(1,1)
print(result)
assert 2==result
def test_div(self):
result = self.calc.div(2,1)
print(result)
assert 2==result
pytest -m add -v -s pytest_Terminal.py
执行mark标记为add的测试用例
--junit-xml:生成一个执行结果为xml的文件
pytest --junit-xml ./result pytest_Terminal.py
创建一个result.xml文件,将执行pytest_Terminal.py文件产生的结果放在其中
pytest-ordering插件
我们一般在做自动化测试时,用例设计之间应该是可以相互独立执行的,没有一定的前后依赖关系的,如果我们真的有前后依赖,想指定用例的先后顺序,可以用到pytest-ordering插件解决这个问题
@pytest.mark.run(order=序号)
@pytest.mark.run(order=2)
def test_div(self):
result = self.calc.div(2,2)
print(result)
assert 1==result
pytest .ini文件【待补充】
可以改变pytest的运行行为
导出依赖包
pip freeze
导出依赖包pip freeze > requirements.txt
导出依赖包到requirements.txt中- 安装导出的依赖包
pip install -r requirements.txt
浮点型的精度问题Decimal( )
Decimal()
方法的参数必须得是一个字符串,计算完以后的结果还是一个Decimal对象,直接用float()
转为和字符串内容相等的浮点数
float(Decimal('6.6'))
yaml用法
将数据存到add.yml文件中,读取文件从而获取数据
import yaml
import pytest
from python.demo import Calc
class TestCal:
# 统一放在setup里面初始化
def setup(self):
self.calc = Calc()
# @pytest.mark.parametrize("case1_a,case1_b",[
# [1,2],
# [0.1,0.2],
# [0,1]
# ])
"""将数据存到add.yml文件中,读取文件从而获取数据"""
@pytest.mark.parametrize("case1_a,case1_b,except_data",
yaml.safe_load(open("D:/workspace/pycharm_station/python测试框架实战/datas/add.yml")))
def test_case1_add(self,case1_a,case1_b,except_data):
result = self.calc.add(case1_a,case1_b)
print(result)
assert except_data==result
# 除法
@pytest.mark.parametrize("case2_a,case2_b,except_data2",)
def test_case2_div(self,case2_a,case2_b,except_data2):
result = self.calc.div(case2_a,case2_b)
print(result)
# assert except_data2 == result
add.yml文件
- [1,2,3]
- [2,3,5]
- [0.1,0.3,0.4]
- [-2,-3,-5]
- [0,0,0]
将方法名封装在steps.yml中,读取文件内容。
如果是'add'则执行'add( )'方法;如果读取的内容=='add1',则执行'add1( )'方法
steps.yml文件
- add
- add1
pyhton测试文件
#import sys
import yaml
import pytest
from python.demo import Calc
# sys.path.append('..')
#读取封装方法名的steps.yml文件,读取的内容是列表格式,以列表格式返回
def steps():
with open('D:/workspace/pycharm_station/python测试框架实战/datas/steps.yml') as f:
return yaml.safe_load(f)
class TestCal:
# 统一放在setup里面初始化
def setup(self):
self.calc = Calc()
# """将数据存到add.yml文件中,读取文件从而获取数据"""
@pytest.mark.parametrize("case1_a,case1_b,except_data",
yaml.safe_load(open("D:/workspace/pycharm_station/python测试框架实战/datas/add.yml")))
def test_case1_add(self, case1_a, case1_b, except_data):
steps1 = steps()
for step in steps1:
if step == 'add':
result = self.calc.add(case1_a,case1_b)
elif step == 'add1':
result = self.calc.add1(case1_a,case1_b)
print(f'\n{step} answer is: {result}' )
#运行结果
============================= test session starts =============================
collecting ... collected 5 items
test_pytest_yaml.py::TestCal::test_case1_add[1-2-3] PASSED [ 20%]
add answer is: 3
add1 answer is: 5
test_pytest_yaml.py::TestCal::test_case1_add[2-3-5] PASSED [ 40%]
add answer is: 5
add1 answer is: 7
test_pytest_yaml.py::TestCal::test_case1_add[0.1-0.3-0.4] PASSED [ 60%]
add answer is: 0.4
add1 answer is: 2.4
test_pytest_yaml.py::TestCal::test_case1_add[-2--3--5] PASSED [ 80%]
add answer is: -5
add1 answer is: -3
test_pytest_yaml.py::TestCal::test_case1_add[0-0-0] PASSED [100%]
add answer is: 0
add1 answer is: 2
============================== 5 passed in 0.08s ==============================
Process finished with exit code 0