Pytest和UnitTest,你会选择哪一个

271 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第一天,点击查看活动详情

做自动化测试需要编写测试用例,编写测试用例就会使用到单元测试模块。今天就通过这一篇文字简单的介绍下Pytest和UnitTest。

UnitTest

说起单元测试,安静立刻想到的就是UnitTest框架,为什么呢?因为安静刚开始学习的时候也是学习的UnitTest框架。

UnitTest属于Python的内置框架,被广泛的应用到各个项目中。

UnitTest最早的时候是受到Junit的启发,UnitTest支持多种自动化测试用例的编写,以及支持用例前置条件和后置数据清理功能也可以将多个测试用例放在测试集中生成测试报告。

Pytest

Pytest也是基于Python的一个单元测试框架,是基于UnitTest的一个扩展框架,比UnitTest更加简洁、方便。

Pytest最主要可以支持第三方插件内容,可以更加高效的完成日常工作。而且Pytest也支持UnitTest的代码框架内容。

断言方面

UnitTest的断言是根据自身携带的断言内容,提供了assertEqual、assertTrue、assertFlase等断言函数。

Pytest的断言是根据Python自带的assert断言内容进行使用的。

用例执行编写规则

UnitTest:可以使用自定义测试类内容,但必须继承unittest.TestCase的方法,测试用例需要以test的方法进行编写,用例的执行顺序是根据ASCII的顺序进行执行的,目前不能指定特定的用例顺序。

UnitTest中提供了TestCase(测试用例)、TestSuite(测试套件)、TestLoder(加载用例)、TextTestRunner(执行用例)等方法让测试用例更加方便编写,编写测试用例必须导入UnitTest模块,执行用例必须带有unittest.main()参数。

Pytest:测试文件名必须以test_开头的py文件或者以*_test.py结尾的py文件,测试类名必须以Test开头,测试用例必须以test_开头。

Pytest可以进行执行UnitTest的用例,Pytest的执行顺序可以通过第三方插件进行定制顺序,默认是通过从上往下的顺序进行执行。

Pytest的执行用例不需要导入模块,执行用例可以通过命令行的形式进行执行。

前后置操作

UnitTest:可以通过setup()和tearDown()的方法来控制用例的前后置操作,并且每条用例执行前后都会执行前后置操作。

通过setupclass()和teardownclass()方法来控制一个class下的所有用例都只执行1次前后置操作。

import unittest

class Test(unittest.TestCase):
    def setUp(self):        
        print('unittest前置操作,每次执行用例都会进行执行')    
    def tearDown(self):        
        print('unittest后置操作,每次执行用例都会进行执行')   
    @classmethod    
    def setUpClass(cls):        
        print('所有用例只执行一次前置操作')    
    @classmethod    
    def tearDownClass(cls):        
        print('所有用例只执行一次后置操作')    
    def test_01(self):        
        print('用例01')    
    def test_02(self):        
        print('用例02')    
    def test_03(self):        
        print('用例03')
if __name__ == '__main__':    
    unittest.main()

通过执行后发现,setupclass下的操作只执行了用例操作,setup每条用例执行前都会执行。

image.png

Pytest:模块级别的前后置操作(setup_module,teardown_function)表示模块下的测试用例只执行1次前后置操作。

image.png

方法级别前后置操作(setup_method,teardown_method)表示是在方法级别中每次都执行的用例的前后置操作。

image.png

从上面的多种setup和teardown可以看出来很方便我们进行编写测试用例,但是Pytest不仅仅是这些。

Pytest中有个固件fixture通过装饰器进行使用,使用范围更加广泛,可以随意命名。可以在fixture中编写前后置操作,通过yield进行区别前置操作和后置操作内容。

import pytest
@pytest.fixture()
def login():    
    print('测试用例前置操作')    
    yield    
    print('测试用例后置操作')
class Test:
    def test01(self, login):        
        print('用例01')    
    def test02(self,login):        
        print('用例02')   
    def test03(self):        
        print('用例03')
if __name__ == '__main__':    
    pytest.main(['-vs'])

通过执行发现,我们在用例03中没有加入fixture,所以他没有执行一些用例的前置和后置操作。

image.png