标签:数据 append 获取数据 ali nal cal app collect sse
目前,一部分公司使用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框架是系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 收集所有以test*.py文件,Test开头的类,和以test开头的函数和方法,都能识别成测试用例
常用参数:
pytest -k ‘add‘
执行包含add的测试用例
pytest -k ‘add‘ or ‘div‘
执行包含add和div的测试用例
pytest --collect-only pytest_Terminal.py
收集pytest_Terminal.py文件中的测试用例
pytest --collect-only
收集当前目录下的测试用例
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的测试用例
pytest --junit-xml ./result pytest_Terminal.py
创建一个result.xml文件,将执行pytest_Terminal.py文件产生的结果放在其中
我们一般在做自动化测试时,用例设计之间应该是可以相互独立执行的,没有一定的前后依赖关系的,如果我们真的有前后依赖,想指定用例的先后顺序,可以用到pytest-ordering插件解决这个问题
@pytest.mark.run(order=2) def test_div(self): result = self.calc.div(2,2) print(result) assert 1==result
可以改变pytest的运行行为
pip freeze
导出依赖包
pip freeze > requirements.txt
导出依赖包到requirements.txt中
安装导出的依赖包 pip install -r requirements.txt
Decimal()
方法的参数必须得是一个字符串,计算完以后的结果还是一个Decimal对象,直接用float()
转为和字符串内容相等的浮点数
float(Decimal(‘6.6‘))
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]
如果是‘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