Python 自动化测试框架unittest与pytest的区别

  引言

  前面一篇文章Python单元测试框架介绍已经介绍了python单元测试框架,你们平时常用的是unittest,由于它比较基础,而且能够进行二次开发,若是你的开发水平很高,集成开发自动化测试平台也是能够的。而这篇文章主要讲unittest与pytest的区别,pytest相对unittest而言,代码简洁,使用便捷灵活,而且插件很丰富。html

  Unittest vs Pytest

  主要从用例编写规则、用例的前置和后置、参数化、断言、用例执行、失败重运行和报告这几个方面比较unittest和pytest的区别:python

  用例编写规则

 

 

 

 

 

  用例前置与后置条件

 

 

 

  断言

 

 

   测试报告

 

 

 

   失败重跑机制

 

 

 

   参数化

 

 

 

  用例分类执行

 

 

 若是很差看,能够看下面表格:flask

  整体来讲,unittest用例格式复杂,兼容性无,插件少,二次开发方便。pytest更加方便快捷,用例格式简单,能够执行unittest风格的测试用例,无须修改unittest用例的任何代码,有较好的兼容性。pytest插件丰富,好比flask插件,可用于用例出错重跑,还有xdist插件,可用于设备并行执行,效率更高。api

  实例演示

  讲了七大区别,总要演示一下具体实例,用事实说话。框架

这里抽用例前置与后置的区别来说,先看unittest的先后置使用:函数

import unittest





class TestFixtures01(unittest.TestCase):
    # 全部用例执行前执行
    def setUp(self) -> None:
        print("setUp开始")
    def tearDown(self) -> None:
        print("tearDown结束")

    # 每条用例执行前执行
    @classmethod
    def setUpClass(cls) -> None:
        print("setUpClass开始")

    @classmethod
    def tearDownClass(cls) -> None:
        print("tearDownClass结束")

    # 测试用例
    def test_001(self):
        print("测试用例001")

class TestFixtures02(unittest.TestCase):
    def test_002(self):
        print("测试类2")

# 每一个模块执行前执行
def setUpModule():
    """
    在全部测试类在调用以前会被执行一次,函数名是固定写法,会被unittest框架自动识别
    """
    print('集成测试 >>>>>>>>>>>>>>开始')
def tearDownModule():
    print("集成测试 >>>>>>>>>>>>>>结束")



if __name__ == '__main__':
    unittest.main()

  运行结果:单元测试

 

 

从结果上得知,三个方法的逻辑优先级:setUp()&tearDown() < setUpClass()&tearDownClass() < setUpModule()&tearDownModule()测试

 

 

接下来看pytest的先后置:插件

一、咱们都知道在自动化测试中都会用到先后置,pytest 相比 unittest 不管是先后置仍是插件等都灵活了许多,还能本身用 fixture 来定义。3d

首先了解一下,用例运行先后置级别以下:

  • 模块级:全局的,整个模块开只运行一次,优先于测试用例。
  • 类级别:定义在类里面,只针对此类生效。相似unittest的cls装饰器
  • 函数级:只对函数生效,类下面的函数不生效。
  • 方法级:定义在类里面,每一个用例都执行一次
def setup_module():
    print('\n整个模块 前 只运行一次')

def teardown_module():
    print('\n整个模块 后 只运行一次')

def setup_function():
    print('\n不在类中的函数,每一个用例 前 只运行一次')

def teardown_function():
    print('\n不在类中的函数,每一个用例 后 只运行一次')

def test_ab():
    b = 2
    assert b < 3

def test_aba():
    b = 2
    assert b < 3


class Test_api():

    def setup_class(self):
        print('\n此类用例 前 只执行一次')
    def teardown_class(self):
        print('\n此类用例 后 只执行一次')

    def setup_method(self):
        print('\n此类每一个用例 前 只执行一次')

    def teardown_method(self):
        print('\n此类每一个用例 后 执行一次')

    def test_aa(self):
        a = 1
        print('\n我是用例:a')       # pytest -s 显示打印内容
        assert a > 0

    def test_b(self):
        b = 2
        assert b < 3

 

运行结果:

 

 

二、这是原始用法,下面看使用Fixture,Fixture 其实就是自定义 pytest 执行用例前置和后置操做,首先建立 conftest.py 文件 (规定此命名),导入 pytest 模块,运用 pytest.fixture 装饰器,默认级别为:函数级:

 

 其它用例文件调用便可,以下定义一个函数,继承 conftest.py 文件里的 login 函数便可调用:

# conftest.py配置须要注意如下点:
# conftest.py配置脚本名称是固定的,不能更名称
# conftest.py与运行的用例要在同一个pakage下,而且有__init__.py文件
# 不须要import导入 conftest.py,pytest用例会自动查找

import pytest

def test_one(login):
	print("登录后,操做111")

# def test_two():
# 	print("操做222")
#
# def test_three(login):
# 	print("登录后,操做333")

 

运行结果:

 

 

三、扩展用法,多个自定义函数和全局级别展现:(全局的好比用于登陆获取到token其余用例模块就不须要再登陆了)

import pytest

def test_one(login):
	print("登录后,操做111")

def test_two(login,open_page):
	print("测试用例2")

def test_three(open_page):
	print("测试用例3")

  

运行结果:

 

 

细心的人应该能够知道,测试用例2并无调用login函数,由于前置设置的是共享模式,相似全局函数。

相关文章
相关标签/搜索