复习补充

 

 

目前,一部分公司使用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