python单元测试unittest模块及产出测试报告

Python自带了一个单元测试的模块--------unittest,该模块封了一些校验返回结果和在执行测试用例前/后初始化的方法。

学unittest之前了解一些名词:

TestCase 也就是测试用例

TestSuite 多个测试用例集合在一起,就是TestSuite

TestLoader是用来加载TestCase到TestSuite中的

TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息

用例必须以test_开头,不然unittest无法识别到测试用例

 

下面展示一个简单的例子

import unittest
        class MyTest(unittest.TestCase):#继承unittest.TestCase
            def tearDown(self):
                #每个测试用例执行之后做操作
                print('111')
            def setUp(self):
                #每个测试用例执行之前做操作
                print(22222)
            def test_run(self):
                self.assertEqual(1,1)
                #测试用例
        
        
        if __name__ == '__main__':#windows中不加此句会报错,使用窗口的run...按钮便于后面生成测试报告,右击页面的run可能会自定识别为unitttest in **.py无法生成测试报告
            unittest.main()#运行所有的测试用例

  

执行如下代码,查看setupclass , teardownclass ,setup,teardown方法的执行顺序

setupcalss  ->setup->test_error ->teardown ->setup->test_noraml ->teardown ->teardownclass

  执行用例顺序是按照test_后的字母先后顺序来执行,先执行test_error  然后执行test_normal

import unittest
def add(a,b):
    return a+b
class AddTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):#在类开始时调用setUpClass方法,一个类只调用一次
        print('setUPClass')

    @classmethod
    def tearDownClass(cls):#在类结束时调用,一个类只调用一次
        print('tearDownClass')

    def setUp(self):#在测试用例前调用setup
        print('SetUp')

    def tearDown(self):#在测试用例执行结束时调用teardown
        print('teardown')

    #测试用例必须使用test_开头,unittest才能识别到
    def test_normal(self):#正常的测试用例。
        result = add(1,1)
        print('test_normal')
        self.assertEqual(2,result)

    def test_error(self):#异常的测试用例
        result = add(1,1)
        print('test_error')
        self.assertEqual(1,result)

if __name__ == '__main__':
    unittest.main() #启动所有的测试用例

  

  返回结果如下:

setUPClass
SetUp
test_error
teardown
SetUp
test_normal
teardown
tearDownClass

  

  常用的断言来检验测试结果

    断言可添加msg来提示,当断言出现false时,提示msg的信息

    注意:当assert断言语句执行后,结果为False时,assert下面后续的代码不会再执行

        assertEqual(a, b,msg='a和b不相等:%s != %s'%(a,b))     a == b      
        assertNotEqual(a, b)     a != b      
        assertTrue(x)     bool(x) is True      
        assertFalse(x)     bool(x) is False      
        assertIsNone(x)     x is None     
        assertIsNotNone(x)     x is not None   
        assertIn(a, b)     a in b    
        assertNotIn(a, b,)     a not in b

  

执行完测试用例后,如果将结果以报告的形式导出呢?这里可以引用 一个第三方模块,HTMLTestRunner,该模块网上可下载,不过可能只支持python 2,可以根据百度结果修改为适用于python3的版本,将下载的文件放置在python的安装目录的lib里

import unittest
def add(a,b):
    return a+b
import HTMLTestRunner
class AddTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):#在类开始时调用setUpClass方法,一个类只调用一次
        print('setUPClass')

    @classmethod
    def tearDownClass(cls):#在类结束时调用,一个类只调用一次
        print('tearDownClass')

    def setUp(self):#在测试用例前调用setup
        print('SetUp')

    def tearDown(self):#在测试用例执行结束时调用teardown
        print('teardown')

    #测试用例必须使用test_开头,unittest才能识别到
    def test_normal(self):#正常的测试用例。
        result = add(1,1)
        self.assertEqual(2,result)
        # print('test_normal')

    def test_error(self):#异常的测试用例
        result = add(1,1)
        self.assertEqual(1,result)
        # self.assertIn(1,[1,2,3,4])
        # self.assertNotEqual(1,1)
        # self.assertFalse()
        # self.assertTrue()
        # print('test_error')


if __name__ == '__main__':
    # HTMLTestRunner产生测试报告
    # test_suite = unittest.makeSuite(AddTest)#将Addtest类建立成一个测试套件
    test_suite = unittest.TestSuite()  # 创建一个测试集合
    test_suite.addTest(AddTest('test_error'))  # 测试套件中添加测试用例
    file = open('report.html', 'wb')
    runner = HTMLTestRunner.HTMLTestRunner(file, title='测试报告')
    runner.run(test_suite)  # run入参只能为测试集合
    file.close()

  

 

由于生成的测试报告样式较为简单,目前可引用更好的测试报告模块,BeautifulReport模块,可通过pip install BeautifulReport模块来安装该模块

import unittest
import BeautifulReport as brf
class TestLogin(unittest.TestCase):


    def test_login_normal(self):
        '''正常登录'''
        self.assertEqual(1,1)

    def test_login_black_list(self):
        '''黑名单登录'''
        self.assertEqual(True,False,msg='黑名单登录运行失败')

    def test_login_exit(self):
        '''用户退出'''
        self.assertNotIn(1,[1,2,3],msg='这个是notin')

    def test_login_max_count(self):
        '''登录最大次数'''
        self.assertNotEqual(1,2,msg='这个是不相等的')

# unittest.main()
if __name__ == '__main__':
    suite = unittest.makeSuite(TestLogin)
    '''BeatifulReport产出测试'''
    runner = brf.BeautifulReport(suite)
    runner.report(description='登录结果测试报告',filename='bf.html')

  

  点开生成的html格式的测试报告,在页面上晃动鼠标右上方将出现各种浏览器图标,点击即可通过浏览器打开,报告效果如下:

    用例描述字段,只需要在测试方法的第一行使用三引号写上注释即可

 

 

posted @ 2020-06-12 13:54  布谷鸟的春天  阅读(440)  评论(0)    收藏  举报