unittest模块学习(一)

最新版本2.1
(如果你已经很熟悉基础的测试概念了,你可以直接跳到‘断言方法的列表’)
python的单元测试框架,通常简称为pyunit,它是由Kent Beck和Erich Gamma编写的junit的python版本。

unittest支持自动化测试,共享测试的建立和关闭代码,将测试聚集成集合,还有独立的测试报告框架。unittest库提供了很多类可以很容易的支持这些质量以进行一些列测试。

为了实现这些,unittest支持很多重要的概念。

测试夹具
测试夹具代表一个测试或者一系列测试所执行时候所需要的准备工作,以及以下关联清除操作。这包含,例如,创建临时或者代理数据库,目录,或者开始服务器进程。


测试用例
测试用例是测试的最小单元。他检查了特定输入集的特定响应。unittest提供了一个基本的类,TestCase,可以用来创建新的测试用例。


测试套件
测试套件是测试用例或者测试套件或者两者的集合。他主要用于聚合应该一起执行的测试。


测试运行器
测试运行器是一个组件,它协调测试的执行并将结果返回给用户。运行器使用了一个图形化接口,一个文本接口,或者返回一个特殊值来表示执行测试的结果。

测试用例和测试夹具的概念通过 TestCase 和 FunctionTestCase 来支持;前者在创建新测试的时候被使用,后者可以在将现有测试代码与单元测试驱动框架集成时使用。当使用TestCase创建测试夹具时可以重写setUp和tearDown方法来为夹具提供初始化和清理。使用FuntionTestCase,现有的函数可以传递构造函数来实现这个目的。当一个测试运行的时候,套件初始化会优先运行。如果成功了,则在执行测试后运行清理方法,不管测试结果如何。TestCase的每个实例将仅用于运行单个测试方法,因此每个测试都会创建一个新的夹具。

测试套件继承TestSuite类。这个类允许单个测试和测试套件进行聚合。当测试套件执行的时候,所有直接添加到套件的测试和子测试套件都会运行。

一个测试运行器是一个对象,它提供一个方法run(),它接收TestCase或者TestSuite对象作为参数,然后返回一个结果对象。TestResult类被用来当做结果对象。unittest提供了一个TextTestRunner类作为一个示例测试运行器,默认情况下他会在标准错误留上报告测试结果。替代运行器可以实现其他环境(比如图形环境),而不需要从特定的类派生。

25.3.1 基础的例子

unittest库为构建和运行测试提供了一套丰富的工具。本节表明,一小部分工具足够满足大多数用户的需求了。
import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

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

创建了一个继承于unittest.Testcase的测试用例。三个单独的测试,每个用以“test”打头的方法命名。这个命名规定告知测试运行器哪些方法代表需要测试。

测试的关键是assertEqual(),这个方法用于检查是否返回预期的结果。assertTrue()或者assertFalse()都用于验证条件。或者使用assertRaises()用于验证是否产生预期的异常。使用这些方法替代assert语句,因此测试运行器可以累积所有的测试结果并生成报告。

setUp(),tearDown()方法运行你定义在测试前或者测试后执行的操作。这两个方法将会在之后的章节详细介绍。
最后一部分展示了一个简单的方法运行这些测试。unittest.main()提供了一个命令行接口给测试脚本。当从命令行运行时,上面的脚本会产生如下所示的输出:
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

除了unittest.main()之外,外有其他一些方法可以用更精细的控制级别运行测试,更简洁的输出,并且不需要从命令行运行。例如,最后两句可以替换成:

suite = unittest.TestLoader().loadTestsFromTestCase(TestStringMethods)
unittest.TextTestRunner(verbosity=2).run(suite)

运行修改后的脚本会产生以下输出:

test_isupper (__main__.TestStringMethods) ... ok
test_split (__main__.TestStringMethods) ... ok
test_upper (__main__.TestStringMethods) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK
以上示例显示了最常用的单元测试功能,足以满足许多日常测试需求。该文档的其余部分是从这些最基本的原则中探索完整的功能集。


感觉看完这一章还是感受颇深,平时用的时候只在百度上随便看了两篇文章,了解的都太泛泛了,还是需要自己看文档才学的踏实。

有疑问的地方

TextTestRunner中的verbosity属性,其实是用在TextTestResult这个类中是返回结果的详尽程度。

如果这个值为1,则形如下例输出:

..F
======================================================================
FAIL: test_upper (__main__.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "E:/test04.py", line 6, in test_upper
    self.assertEqual('foo'.upper(), 'FO')
AssertionError: 'FOO' != 'FO'

----------------------------------------------------------------------
Ran 3 tests in 0.001s

FAILED (failures=1)

如果这个值大于2,则形如下例输出:

test_isupper (__main__.TestStringMethods) ... ok
test_split (__main__.TestStringMethods) ... ok
test_upper (__main__.TestStringMethods) ... FAIL

======================================================================
FAIL: test_upper (__main__.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "E:/test04.py", line 6, in test_upper
    self.assertEqual('foo'.upper(), 'FO')
AssertionError: 'FOO' != 'FO'

----------------------------------------------------------------------
Ran 3 tests in 0.001s

FAILED (failures=1)



你可能感兴趣的:(unittest)