3种最流行的 Python单元测试框架,你更pick谁?

发表于:2021-1-27 09:13

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:weixin_39711914    来源:CSDN

  前言
  在进行Python程序单元测试时,测试框架的选型是一个首要的问题。面对众多Python单元测试框架,我应该选择哪一个?
  本文将探讨这个问题。文章的结构如下。首先,介绍单元测试,框架以及测试框架的基本概念;接着,介绍三种最流行的Python单元测试框架,分别是unittest, nose和pytest;然后,介绍作者关于Python单元测试框架选型的思考和心得;最后,总结全文。
  基本概念
  在介绍具体的Python单元测试框架之前,我们先来回顾一些基本概念。
  什么是单元测试?单元测试是软件测试的一种类型。顾名思义,单元测试就是测试的对象是程序中的最小单元的测试。程序的最小单元可以是一个函数,一个类,也可以是函数的组合,类的组合。
  单元测试是软件测试中最低级别的测试活动,与之相对的更高级别的测试有模块测试,集成系统和系统测试等。单元测试一般由软件开发者而不是独立的测试工程师完成。另外,单元测试有一个隐含的性质,那就是单元测试天然就是自动化的,单元测试属于自动化测试
  什么是框架?首先,框架是一个“架子”。这个架子能够完成领域内基础的、重要的功能。基于这个已有的架子,我们可以将重心放在面向业务的开发上。
  其次,框架也是一个“框框”。“框框”为我们设置了有形和无形的约束。所谓有形的约束,就是我们的开发工作需要符合框架的定义、与框架兼容。所谓无形的约束,就是我们的开发工作需要承受框架的缺点和不足(毕竟,没有十全十美的框架)。
  什么是测试框架? 我们知道,软件测试分为手工测试和自动化测试。需要注意的是,一般只有自动化测试才有框架的概念。(自动化)测试框架,需要提供自动化测试用例编写、自动化测试用例执行、自动化测试报告生成等基础功能。
  有了测试框架,我们只需要完成和业务高度相关的测试用例设计和实现即可。另外,框架会为我们处理好复杂度与扩展性的问题,我们无需为此操心。
  有了这些概念作为支撑,我们就很容易理解什么是Python单元测试框架了。所谓Python单元测试框架,就是面向Python编程语言,服务于Python单元测试的自动化测试框架。
  主流框架
  Python单元测试框架有很多,我们介绍最流行的三种。
  unittest
  unittest是Python标准库中自带的单元测试框架。unittest有时候也被称为PyUnit。就像JUnit是Java语言的标准单元测试框架一样,unittest(PyUnit)则是Python语言的标准单元测试框架。
  unittest支持自动化测试,测试用例的初始化和关闭,测试用例的聚合等功能。unittest有一个很重要的特性:它通过类(class)的方式,将测试用例组织在一起。
  一个简单的示例如下:
import unittest

class TestStringMethods(unittest.TestCase):

def test_upper(self):

self.assertEqual('foo'.upper(), 'FOO')

if__name__=='__main__':

unittest.main()
  执行结果:
...

---------------------

Ran 1 tests in 0.000s

  需要注意的是,unittest有一个关联模块unittest2。但是unittest2仅适用于Python 2.4-2.6。这是因为,从Python 2.7开始,unittest增加一些新的特性。为了在老的版本Python 2.4-2.6支持这些特性,提供了unittest2这个库。对于Python 2.7及之后的版本,unittest是唯一的。
  nose
  nose是Python的一个第三方单元测试框架。这意味着,如果要使用nose,需要先显式安装它。
  与unittest不同的是,nose的测试用例并不限制于类。任何函数和类,只要名称匹配一定的条件(例如,以test开头或以test结尾等),都会被自动识别为测试用例;并且,为了兼容unittest, 所有的基于unitest编写的测试用例,也会被nose自动识别为。
  一个简单的nose单元测试示例如下:
import nose

def test_example ():

pass

if __name__ == '__main__':

nose.runmodule()
  执行结果:
...

---------------------

Ran 1 tests in 0.000s
  需要注意的是,nose已经进入维护模式,从github nose上可以看到,nose最近的一次代码提交还是在2016年5月4日。继承nose的是nose2,但要注意的是,nose2并不支持nose的全部功能,它们的区别可以看这里。
  nose2的主要目的是扩展Python的标准单元测试库unittest,因此它的定位是“带插件的unittest”。nose2提供的插件,例如测试用例加载器,覆盖度报告生成器,并行测试等内置插件和第三方插件,让单元测试变得更加完善。
  pytest
  pytest是Python另一个第三方单元测试库。它的目的是让单元测试变得更容易,并且也能扩展到支持应用层面复杂的功能测试
  pytest的特性有:
  ·支持用简单的assert语句实现丰富的断言,无需复杂的self.assert*函数
  ·自动识别测试模块和测试函数
  ·兼容unittest和nose测试集
  ·支持Python3和PyPy3
  ·丰富的插件生态,已有300多个各式各样的插件,和活跃的社区
  pytest一个简单的示例如下:
def inc(x):

return x +1

def test_answer():

assert inc(3) ==5
  执行结果如下:
$ pytest

============================= test session starts=============================

collected 1 items

test_sample.py F

================================== FAILURES===================================

_________________________________ test_answer_________________________________

def test_answer():

> assert inc(3)== 5

E assert 4 == 5

E + where 4 = inc(3)

test_sample.py:5: AssertionError

========================== 1 failed in 0.04 seconds===========================
  框架选型
  (1) 从入门难度看,pytest/nose优于unittest
  虽然unittest是Python自带的单元测试库,但是要上手unittest是有难度的,既需要了解testrunner, testsuite, testcase等基本概念,还需要熟悉面向对象编程。而pytest/nose则为我们隐藏了这些细节,因而能够降低入门单元测试的难度。
  对于有一定Python编程基础的人来说,unittest是适合的;对于Python编程基础较弱的人来说,nose和pytest则比较适合。另外,对比nose和pytest,一般认为pytest的入门难度更低。
  (2) 同为第三方库,pytest的生态优于nose/nose2
  我们知道,nose已经进入了维护模式,取代者是nose2。相比nose2,pytest的生态无疑更具优势,社区的活跃度也更高。
  例如,在github上,截止现在,pytest的STAR数量是4229,而nose2的STAR数量是558;pytest的提交数量是10384,而nose2的提交数量是917。最重要的,pytest的插件数量是300多个,远高于nose2的20多个插件。
  如果只需要基本的插件,那么nose和pytest都是适合的;如果追求单元测试更丰富的插件,那么pytest更适合。
  (3) 从通用性角度看,pytest优于unittest和nose
  与unittest/nose不同的是,pytest不仅能用于单元测试,还能用于更高级别的,面向应用的功能测试。因此,如果需要进行更高级别的测试,则适合采用Pytest。
  总结
  在进行Python程序测试时,测试框架的选型是一个重要的问题。众多测试框架之间,我到底应该选择哪一个?
  本文对比了unittest,nose和pytest这三种最流行的Python单元测试测试,指出了各个框架的特点,指出了在不同场景和不同需求下,哪一种框架更适合。当然,本文的分析还是比较初步的,在实际中,还需要结合具体情况深入分析后再做决定。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号