python单元测试unittest

运行方式一:unittest.main()

用unittest.main()全部运行,用例必须是以test开头,结果不会生成报告

import unittest
def add(a,b):
    return a+b
class TestAdd(unittest.TestCase):
    '''测试加法类'''
    def test_add_1normal(self):
        '''正常测试加法'''
        result = add(1,2)
        self.assertEqual(3,result)
    def test_add_2error1(self):
        '''测试失败'''
        result = add(1,2)
        self.assertEqual(4,result)
    def test_add_3error2(self):
        '''测试失败带信息'''
        result = add(1,2)
        self.assertEqual(4,result,'正常整数相加,结果错误')
if __name__ == '__main__':
    # 不产生测试报告
    unittest.main()

运行结果:

 运行方式二:生成报告

报告样式1生成:

将HTMLTestRunner文件加入环境变量中或项目目录下

引入HTMLTestRunner包

import HTMLTestRunner

运行某些用例:

if __name__ == '__main__':
    # 运行某一个用例
    test_suite = unittest.TestSuite()
    test_suite.addTest(TestAdd('test_add_1normal'))#运行某一个用例
    test_suite.addTest(TestAdd('test_add_2error1'))
    test_suite.addTest(TestAdd('test_add_3error2'))
    with open('report.html','wb') as fw:
        runner = HTMLTestRunner.HTMLTestRunner(stream=fw,title='测试报告',description='接口测试报告',verbosity=3)
        runner.run(test_suite)

运行所有用例:

if __name__ == '__main__':
    # 运行类中的所有用例
    test_suite = unittest.makeSuite(TestAdd)
    with open('report.html', 'wb') as fw:
        runner = HTMLTestRunner_PY3.HTMLTestRunner(stream=fw, title='测试报告', description='接口测试报告', verbosity=3)
        runner.run(test_suite)

运行结果:

 报告:

 报告样式2生成:

import HTMLTestRunner_PY3
# 运行类中的所有用例
    test_suite = unittest.makeSuite(TestAdd)
    with open('report.html', 'wb') as fw:
        runner = HTMLTestRunner_PY3.HTMLTestRunner(stream=fw, title='测试报告', description='接口测试报告', verbosity=3)
        runner.run(test_suite)

运行某个目录下的所有符合条件的用例:

# 查找某个目录下的所有测试用例
    test_suite = unittest.defaultTestLoader.discover('cases','case*.py')
    with open('report.html', 'wb') as fw:
        runner = HTMLTestRunner_PY3.HTMLTestRunner(stream=fw, title='测试报告', description='接口测试报告', verbosity=3)
        runner.run(test_suite)

报告:

 参数化:

import unittest
import HTMLTestRunner_PY3
import parameterized  #引包

class TestAdd(unittest.TestCase):
    @parameterized.parameterized.expand([   #二维数组
        [1,2,3,'参数化1'],
        [-1,2,1,'参数化2'],
        [-1,2,2,'参数化3']
    ]
    )
    def test_param_add(self,a,b,c,desc):
        self._testMethodDoc = desc #每个用例描述参数化
        result = add(a,b)
        self.assertEqual(c,result,'预期是%s,实际是%s'%(c,result)) #断言
if __name__ == '__main__':
    # 运行类中的所有用例
    test_suite = unittest.makeSuite(TestAdd)
    with open('report.html', 'wb') as fw:
        runner = HTMLTestRunner_PY3.HTMLTestRunner(stream=fw, title='测试报告', description='接口测试报告', verbosity=3)
        runner.run(test_suite)

setUpClass、tearDownClass、setUp、tearDown:

初始化类方法和类结束时运行的方法(setUpClass、tearDownClass),每个用例执行时会运行两个方法(setUp、tearDown)

用例的执行顺序是按照函数名的ASCII表顺序

 1 import unittest
 2 from unittest import TestCase
 3 
 4 def calc(a,b):
 5     c = a//b
 6     return c
 7 
 8 class MyTest(TestCase):
 9     @classmethod#类方法
10     def setUpClass(cls):#所有用例执行之前运行它用 如只连接一次数据库
11         print('我是setUpclass')
12     @classmethod
13     def tearDownClass(cls):#类中所有用例执行完后运行 如运行完后关闭数据库
14         print('我是tearDownClass')
15 
16     def setUp(self):#每条用例执行之前都会运行它  当注册时可以判断用户名是否已存在,若存在先删除
17         print('setUp 什么时候运行我呢')
18     def tearDown(self):#每条用例执行之后都会运行它
19         print('tearDown 什么时候运行我呢')
20     def test_calc1(self):#用例运行顺序是根据函数名的字母顺序决定的
21         #正常的测试用例
22         res = calc(4,2)
23         print('第一条用例')
24         self.assertEqual(2,res,'预期结果和实际结果不符合 预期结果是 2 实际结果是%s'%res)#断言
25     def test_calc2(self):
26             # 不正常的测试用例
27         res = calc(5, 1)
28         print('第二条用例')
29         self.assertEqual(5, res)
30     def test_calc3(self):
31             # 不正常的测试用例
32         res = calc(6, 1)
33         print('第三条用例')
34         self.assertEqual(6, res)
35 unittest.main()

报告样式生成3:

每条测试用例加描述,更漂亮的测试报告写法,BeautifulReport包需要加入环境变量中

 1 import HTMLTestRunner
 2 import BeautifulReport
 3 import unittest
 4 from unittest import TestCase
 5 
 6 def calc(a,b):
 7     c = a//b
 8     return c
 9 
10 class MyTest(TestCase):
11     @classmethod#类方法
12     def setUpClass(cls):#所有用例执行之前运行它用 如只连接一次数据库
13         print('我是setUpclass')
14     @classmethod
15     def tearDownClass(cls):#类中所有用例执行完后运行 如运行完后关闭数据库
16         print('我是tearDownClass')
17 
18     def setUp(self):#每条用例执行之前都会运行它  当注册时可以判断用户名是否已存在,若存在先删除
19         print('setUp 什么时候运行我呢')
20     def tearDown(self):#每条用例执行之后都会运行它
21         print('tearDown 什么时候运行我呢')
22     def test_calc1(self):#用例运行顺序是根据函数名的字母顺序决定的
23         #正常的测试用例
24         '''正常的测试用例'''
25         res = calc(4,2)
26         print('第一条用例')
27         self.assertEqual(2,res,'预期结果和实际结果不符合 预期结果是 2 实际结果是%s'%res)#断言
28     def test_calc2(self):
29             # 不正常的测试用例
30         '''不正常的测试用例'''
31         res = calc(5, 1)
32         print('第二条用例')
33         self.assertEqual(2, res)
34     def test_calc3(self):
35             # 不正常的测试用例
36         '''描述一下'''
37         res = calc(6, 1)
38         print('第三条用例')
39         self.assertEqual(6, res)
40 # unittest.main()#它可以帮你运行当前python文件里面的所有用例
41 test_suite = unittest.TestSuite()#定义一个测试集合
42 # test_suite.addTests(MyTest('test_calc3'))#只加入某一个测试用例
43 test_suite.addTest(unittest.makeSuite(MyTest))#把类里所有的测试用例都加入集合
44 # test_suite.addTest()
45 #下面是漂亮的测试报告
46 report = BeautifulReport.BeautifulReport(test_suite)
47 report.report(description='周的测试',filename='report2.html',log_path='/Users/ihealth-qa/PycharmProjects/untitled/practice')#不用打开文件,直接生成文件,默认在当前,log_path=''可以指定文件位置

原文地址:https://www.cnblogs.com/Mezhou/p/10053821.html