# 简单示例

# unittest示例

  1. 准备一些待测方法:

    # mathfunc.py
    def add(a, b):
        return a+b
    
    def minus(a, b):
        return a-b
    
    def multi(a, b):
        return a*b
    
    def divide(a, b):
        return a/b
    
    
  2. 为这些方法写一个测试:

    # test_mathfunc.py
    # -*- coding: utf-8 -*-
    
    import unittest
    from mathfunc import *
    
    
    class TestMathFunc(unittest.TestCase):
        """Test mathfuc.py"""
    
        def test_add(self):
            """Test method add(a, b)"""
            self.assertEqual(3, add(1, 2))
            self.assertNotEqual(3, add(2, 2))
    
        def test_minus(self):
            """Test method minus(a, b)"""
            self.assertEqual(1, minus(3, 2))
    
        def test_multi(self):
            """Test method multi(a, b)"""
            self.assertEqual(6, multi(2, 3))
    
        def test_divide(self):
            """Test method divide(a, b)"""
            self.assertEqual(2, divide(6, 3))
            self.assertEqual(2.5, divide(5, 2))
    
    if __name__ == '__main__':
        unittest.main()
    
    
  3. 查看执行结果

    .F..
    ======================================================================
    FAIL: test_divide (__main__.TestMathFunc)
    Test method divide(a, b)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:/py/test_mathfunc.py", line 26, in test_divide
        self.assertEqual(2.5, divide(5, 2))
    AssertionError: 2.5 != 2
    
    ----------------------------------------------------------------------
    Ran 4 tests in 0.000s
    
    FAILED (failures=1)
    
    

    执行结果:能够看到一共运行了4个测试,失败了1个,并且给出了失败原因,2.5 != 2 也就是说我们的divide方法是有问题的。

    • 在第一行给出了每一个用例执行的结果的标识,成功是 .,失败是 F,出错是 E,跳过是 S。从上面也可以看出,测试的执行跟方法的顺序没有关系,而是按照方法的ANCII顺序进行执行。

    • 每个测试方法均以 test 开头,否则是不被unittest识别的。

    • 在unittest.main()中加 verbosity 参数可以控制输出的错误报告的详细程度,默认是 1,如果设为 0,则不输出每一用例的执行结果,即没有上面的结果中的第1行;如果设为 2,则输出详细的执行结果(每一个用例的详细执行情况以及用例名以及用例描述),如下:

      test_add (__main__.TestMathFunc)
      Test method add(a, b) ... ok
      test_divide (__main__.TestMathFunc)
      Test method divide(a, b) ... FAIL
      test_minus (__main__.TestMathFunc)
      Test method minus(a, b) ... ok
      test_multi (__main__.TestMathFunc)
      Test method multi(a, b) ... ok
      
      ======================================================================
      FAIL: test_divide (__main__.TestMathFunc)
      Test method divide(a, b)
      ----------------------------------------------------------------------
      Traceback (most recent call last):
        File "D:/py/test_mathfunc.py", line 26, in test_divide
          self.assertEqual(2.5, divide(5, 2))
      AssertionError: 2.5 != 2
      
      ----------------------------------------------------------------------
      Ran 4 tests in 0.002s
      
      FAILED (failures=1)