python编程实例之python单元测试

发布时间:2020-08-21编辑:脚本学堂
本文介绍了python单元测试的相关知识,python编程实例之python单元测试教程,有需要的朋友参考下。

python中单元测试可以使用doctest,unittest完成,下面通过实例来介绍。

1.doctest的使用
(1)写入程序(cubetest.py):
 

复制代码 代码示例:
#!/usr/bin/python 
def cube(x): 
    """
    cube a number and return the result
    
    >>> cube(2)
    8
    >>> cube(3)
    27
    >>> cube(4)
    64
    """ 
    return x**3; 
if __name__=='__main__': 
    import doctest; 
    doctest.testmod(verbose=True); 
 

测试用例写在字符串””” cube a number… “””中。

调用doctest中的testmod的方法即可测试。
输出:
Trying:
    cube(2)
Expecting:
    8
ok
Trying:
    cube(3)
Expecting:
    27
ok
Trying:
    cube(4)
Expecting:
    64
ok

1 itemshad no tests:
    __main__

1 itemspassed all tests:
   3 tests in __main__.cube
3 testsin 2 items.
3 passedand 0 failed.
Testpassed.
TestResults(failed=0, attempted=3)

 (2)也可以把测试用例写在记事本文件中。
 新建记事本example.txt,写入内容:
 

复制代码 代码示例:

>>> from cubetest import cube

>>> cube(1)

1

>>> cube(2)

8

>>> cube(4)

64

 然后写测试代码 test.py:
 

复制代码 代码示例:
import doctest 
doctest.testfile("example.txt") 
 

使用python test.py  –v 执行测试代码,可以得到以下结果
 

Trying:
    from cubetest import cube
Expectingnothing
ok
Trying:
    cube(1)
Expecting:
    1
ok

Trying:
    cube(2)
Expecting:

    8

ok

Trying:
    cube(4)
Expecting:
    64

ok

1 items passedall tests:
   4 tests in example.txt
4 tests in 1items.
4 passed and 0failed.
Test passed.  

                        

 2.unittest的使用

(1)写待测试的程序如下:
 

复制代码 代码示例:
def iseven(x): 
    if(x%2==0): 
        return 1; 
    else: 
        return 0; 
def isodd(x): 
    if(x%2==1): 
        return 1; 
    else: 
        return 0; 
 

测试程序中的类eventest类继承自TestCase,它包含setUp() ,test_1(),test_2()和tearDown()四个方法。在测试运行前,会自动运行setUp()方法,在测试完成之前,会自动调用tearDown()方法。test_1()和test_2()是自定义的测试方法。

写测试程序如下:
 

复制代码 代码示例:
import unittest,evenodd 
class eventest(unittest.TestCase): 
    def setUp(self): 
        self.ex1=range(0,2,20); 
        self.ex2=range(1,2,20); 
    def test_1(self): 
         
        for x in self.ex1: 
            x=evenodd.iseven(x); 
            self.assertEqual(x,1); 
        for x in self.ex2: 
            x=evenodd.iseven(x); 
            self.assertEqual(x,0); 
    def test_2(self): 
         
        for x in self.ex1: 
            x=evenodd.isodd(x); 
            self.assertEqual(x,0); 
        for x in self.ex2: 
            x=evenodd.isodd(x); 
            self.assertEqual(x,1); 
    def tearDown(self): 
        self.ex1=None; 
        self.ex2=None; 
if __name__=='__main__': 
    unittest.main(); 
 

上面用到了self.AssertEqual(),类似的判断方法还有:
 

assertNotEqual(a,b)   a!=b
asserTrue(x)     bool(x)为真
assertFalse(x)     bool(x)为假
assertIs(a,b)     a is b
assertIsNot(a,b)   a is not b
assertIsNone(x)    x is None
assertIsNotNone(x)   x is not None
assertIn (a,b)   a in b
assertNotIn(a,b)  a not in b
assertIsInstance(a,b)   isinstance(a,b)
assertNotIsInstance(a,b)   not instance(a,b)

(2) 也可以使用TestSuite对测试用例进行封装,下面的程序定义了类evensuite,它继承自类TestSuite,方法addTest()用于添加测试方法。

测试程序:
 

复制代码 代码示例:
import unittest,evenodd 
class eventest(unittest.TestCase): 
    def setUp(self): 
        self.ex1=range(0,2,20); 
        self.ex2=range(1,2,20); 
    def test_1(self): 
        for x in self.ex1: 
            x=evenodd.iseven(x); 
            self.assertEqual(x,1); 
        for x in self.ex2: 
            x=evenodd.iseven(x); 
            self.assertEqual(x,0); 
    def test_2(self): 
        for x in self.ex1: 
            x=evenodd.isodd(x); 
            self.assertEqual(x,0); 
        for x in self.ex2: 
            x=evenodd.isodd(x); 
            self.assertEqual(x,1); 
    def tearDown(self): 
        self.ex1=None; 
        self.ex2=None; 
class evensuite(unittest.TestSuite): 
    def suite(self): 
        suite=unittest.TestSuite(); 
        suite.addTest(eventest('test_1')); 
        suite.addTest(eventest('test_2')); 
        return suite; 
     
if __name__=='__main__': 
    unittest.main(); 
 

运行程序 ,结果输出:
_ _
ran 2 tests in 0.001s
OK