python自动化测试学习笔记-8单元测试unittest模块

官方参考文档:http://docs.python.org/2.7/library/unittest.html

unittest是一个python版本的junit,junit是java中的单元测试框架,对java的单元测试,有一句话很贴切:Keep the bar green,相信使用eclipse写过java单元测试的都心领神会。unittest实现了很多junit中的概念,比如我们非常熟悉的test case, test suite等,总之,原理都是相通的,只是用不同的语言表达出来。

unittest中的4个重要的概念:test fixture, test case, test suite, test runner

来看一个简单的例子:

 import unittest
import random

class MyTest(unittest.TestCase):
def setUp(self):
self.num=range(10)
def testradom(self):
self.assertTrue(random.choice(self.num)in self.num )

def test1(self):
num1=random.choice(self.num)
num2=random.choice(self.num)
self.assertEqual(num1,num2)
def test2(self):
num1=random.choice(self.num)
self.assertTrue(num1<10)

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

执行查看结果:

MyTest类继承自unittest.TestCase,

setup用来初始化数据,只会运行一次;

每一个以test开头的方法,都会为其构建TestCase对象,使用unittest.main方法执行函数;所以再写测试用例的时候一定是以test开头

单元测试的加载方式有2种:一种是通过unittest.main()来启动单元测试的测试模块;一种是添加到testsuite集合中再加载所有的被测试对象,而testsuit里存放的就是单元测试的用例

'FunctionTestCase':函数测试用例,即给一个函数作为参数,返回一个testcase实例,可选参数有set-up,tear-down方法
'TestCase':所有测试用例的基本类,给一个测试方法的名字,返回一个测试用例实例
'TestLoader':测试用例加载器,其包括多个加载测试用例的方法。返回一个测试套件
loadTestsFromModule(self, module)--根据给定的模块实例来获取测试用例套件
loadTestsFromName(self, name, module=None)
--根据给定的字符串来获取测试用例套件,字符串可以是模块名,测试类名,测试类中的测试方法名,或者一个可调用的是实例对象
这个实例对象返回一个测试用例或一个测试套件
loadTestsFromNames(self, names, module=None) --和上面功能相同,只不过接受的是字符串列表
loadTestsFromTestCase(self, testCaseClass)--根据给定的测试类,获取其中的所有测试方法,并返回一个测试套件
'TestProgram':命令行进行单元测试的调用方法,作用是执行一个测试用例。其实unittest.main()方法执行的就是这个命令,
而这个类实例时默认加载当前执行的作为测试对象,
原型为 __init__(self, module='__main__', defaultTest=None, argv=None, testRunner=xx, testLoader=xx)
其中module='__main__'就是默认加载自身
'TestResult':测试用例的结果保存实例,通常有测试框架调用
'TestSuite':组织测试用例的实例,支持测试用例的添加和删除,最终将传递给testRunner进行测试执行
'TextTestRunner':进行测试用例执行的实例,其中Text的意思是以文本形式显示测试结果。显示测试名称,即完成的测试结果,其过同执行单元测试脚本时添加-v参数
'defaultTestLoader':其实就是TestLoader
'findTestCases', 'getTestCaseNames':这个2个就不用解释了
'main': 其实就是TestProgram
'makeSuite':通常是由单元测试框架调用的,用于生产testsuite对象的实例


 使用测试套件的方法,完整测测试步骤分三步:

第一步testloader根据传入的参数获得相应的测试用例,即对应具体的测试方法,
然后makesuite在把所有的测试用例组装成testsuite,最后把testsiute传给testrunner进行执行。
而我们通常执行的unittest.main(),其实就是unittest.testprom方法,其执行的功能就是上面分析的三步,在第一步中其传入的参数是自身的模块__main__;
在第二步中把自身模块中的所有测试类中中的测试方法提取出来,并生成测试套件;最后再把测试套件传递给testrunner进行具体的测试。

最后给出一个完整的单元测试组织代码,把该代码放到单元测试用例文件的同一个目录后执行该脚本,即可执行所有的测试用例文件。

例子:

import unittest
import random

class MyTest(unittest.TestCase):
def setUp(self):
self.num=range(10)
def testrandom(self):
self.assertTrue(random.choice(self.num)in self.num )

def test1(self):
num1=random.choice(self.num)
num2=random.choice(self.num)
self.assertEqual(num1,num2)
def test2(self):
num1=random.choice(self.num)
self.assertTrue(num1<10)

if __name__ == '__main__':
#unittest.main()
#定义一个测试套件
suite=unittest.TestSuite()
#添加测试用例
#添加单个测试用例
suite.addTest(MyTest('test1'))
suite.addTest(MyTest('test2'))
suite.addTest(MyTest('testrandom'))
unittest.TextTestRunner(verbosity=2).run(suite)

unittest.suite(),创建一个测试套件,suite.addTest()添加单个用例到测试套件中,需要把每一个要执行的用例都添加一遍,unittest.TextTestRunner().run()执行测试测试套件的所有用例;

我们也可以用addTests()方法添加多个测试用例,用makesuite(),搜索所有测试用例添加到测试套件,如下:

import unittest
import random

class MyTest(unittest.TestCase):
def setUp(self):
self.num=range(10)
def testrandom(self):
self.assertTrue(random.choice(self.num)in self.num )

def test1(self):
num1=random.choice(self.num)
num2=random.choice(self.num)
self.assertEqual(num1,num2)
def test2(self):
num1=random.choice(self.num)
self.assertTrue(num1<10)

if __name__ == '__main__':
#unittest.main()
#定义一个测试套件
suite=unittest.TestSuite()
#添加测试用例
#添加单个测试用例
suite.addTests(unittest.makeSuite(MyTest))
unittest.TextTestRunner(verbosity=2).run(suite)

执行查看结果:

test1 (__main__.MyTest) ... ok
test2 (__main__.MyTest) ... ok
testrandom (__main__.MyTest) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

为了能方便的查看到执行的测试用例通过情况,我们可以引用HTMLTestRunner生成测试报告,如下:

import unittest
import random
import HTMLTestRunner

class MyTest(unittest.TestCase):
def setUp(self):
self.num=range(10)
def testrandom(self):
self.assertTrue(random.choice(self.num)in self.num )

def test1(self):
num1=random.choice(self.num)
num2=random.choice(self.num)
self.assertEqual(num1,num2)
def test2(self):
num1=random.choice(self.num)
self.assertTrue(num1<10)

if __name__ == '__main__':
#unittest.main()
#定义一个测试套件
suite=unittest.TestSuite()
#添加测试用例
#添加单个测试用例
# suite.addTest(MyTest('test1'))
# suite.addTest(MyTest('test2'))
# suite.addTest(MyTest('testrandom'))
suite.addTests(unittest.makeSuite(MyTest))
#unittest.TextTestRunner(verbosity=2).run(suite)
runner=HTMLTestRunner.HTMLTestRunner(stream=open('测试报告.html','wb'),title='unittest测试报告',description='示例')
runner.run(suite)

上述需要注意的是,生成文件的类型需要是html格式的文件,否则无法打开,执行查看结果:

为了是报告更加美化。我们可以使用BeautifulReport来运行测试用例,如下:

import unittest
import random
import HTMLTestRunner
from BeautifulReport import BeautifulReport
class MyTest(unittest.TestCase):
def setUp(self):
self.num=range(10)
def testrandom(self):
self.assertTrue(random.choice(self.num)in self.num )

def test1(self):
num1=random.choice(self.num)
num2=random.choice(self.num)
self.assertEqual(num1,num2)
def test2(self):
num1=random.choice(self.num)
self.assertTrue(num1<10)

if __name__ == '__main__':
#unittest.main()
#定义一个测试套件
suite=unittest.TestSuite()
#添加测试用例
#添加单个测试用例
# suite.addTest(MyTest('test1'))
# suite.addTest(MyTest('test2'))
# suite.addTest(MyTest('testrandom'))
suite.addTests(unittest.makeSuite(MyTest))
#unittest.TextTestRunner(verbosity=2).run(suite)
# runner=HTMLTestRunner.HTMLTestRunner(stream=open('测试报告.html','wb'),title='unittest测试报告',description='示例')
# runner.run(suite)
result=BeautifulReport(suite)
result.report(description='测试案例',filename='漂亮的测试报告')

执行查看结果,生成了html文件:

 

posted @ 2018-03-20 17:33  yingfeipei  阅读(1073)  评论(0编辑  收藏  举报