python 使用unittest进行单元测试

import unittest
import HTMLTestRunner

"""
Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作。

在说unittest之前,先说几个概念:

TestCase 也就是测试用例

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

TestLoader是用来加载TestCase到TestSuite中的

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

生成测试报告:
    1.HTMLTestRunner,这个模块需要自己安装,使用执行测试用例就会生成一个html的测试报告,里面会有每个测试用例的执行结果
    2.HTMLTestRunner是Python标准库的unittest模块的扩展,无法通过pip安装;
    3.执行命令: wget http://tungwaiyip.info/software/HTMLTestRunner.html 下载HTMLTestRunner.py 并将文件放到python2安装目录的Lib下,这个是python2版本.
    4.HTMLTestRunner python3版本下载 访问 https://www.cnblogs.com/testyao/p/5658200.html 自行下载 并将文件放到python3安装目录的lib目录下
"""


class MyTest(unittest.TestCase):  # 必须继承自unittest.TestCase

    def tearDown(self):  # 每个测试用例执行完之后,都会执行一下这个方法
        print("测试完成\n")

    def setUp(self):  # 每个测试用例执行之前都会执行这个方法
        print("测试开始\n")

    @classmethod  # 必须使用@classmethod装饰器, 所有test运行完后运行一次
    def tearDownClass(cls):
        print("所有测试完成\n")

    @classmethod
    # 必须使用@classmethod装饰器,所有test运行前运行一次
    def setUpClass(cls):
        print("所有测试开始前\n")

    def test_a_run(self):
        # 可以把需要执行的函数放到这里进行执行
        self.assertEqual(1, 1)  # 测试用例, 必须以test开头, 如果测试不通过,会报异常

    def test_b_run(self):
        self.assertEqual(2, 1)  # 测试用例, 必须以test开头, 如果测试不通过,会报异常

    # assertEqual(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


if __name__ == '__main__':

    # unittest.main() # 直接进行测试, 不生成测试报告, 可以在终端的输出看是否有异常,没有异常就说明测试通过


    # 下面这段逻辑:需要生成测试报告才这样操作 #

    test_suite = unittest.TestSuite()  # 创建一个测试集合

    # test_suite.addTest(MyTest('test_a_run'))  # 测试套件中添加单个测试用例

    test_suite.addTest(unittest.makeSuite(MyTest))  # 使用makeSuite方法添加所有的测试方法

    with open('unittest_res.html', 'wb') as f:  # 打开一个保存结果的html文件

        runner = HTMLTestRunner.HTMLTestRunner(stream=f, title='api测试报告', description='测试情况')

        # 生成执行用例的对象
        runner.run(test_suite)


def test_note_1():
    """
    如果我们有很多个模块,每个模块下面都写了很多python文件,每个python文件里面都有测试用例,
    那怎么把这个目录下的用例都执行了呢,就要先找到这个目录下的所有python文件,然后找到里面的测试用例,
    逐个执行,代码如下:
    """
    suite = unittest.TestSuite()  # 生成创建测试套件

    all_cases = unittest.defaultTestLoader.discover('.', 'test_*.py')  # 第一个参数是路径

    # 找到某个目录下所有的以test开头的Python文件里面的测试用例
    for case in all_cases:
        suite.addTests(case)  # 把所有的测试用例添加进来

    fp = open('res.html', 'wb')
    fp.close()
    runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='all_tests', description='所有测试情况')

    # 运行测试
    runner.run(suite)

    # 把这些代码替换到入口函数中即可



"""
我们在后续进行持续集成的时候,要让代码自动运行,就会用到Jenkins了,但是上面产生的测试报告都是html格式的,
Jenkins不认识,就在Jenkins里面显示不出来。那咱们就要产生一些Jenkins认识的测试报告,
Jenkins认识xml格式的报告,那咱们就产生xml格式的呗,就需要用一个新的模块,xmlrunner,
安装直接 pip install xmlrunner即可,代码如下:
"""
# 导入模块
import unittest
import xmlrunner


class My(unittest.TestCase):

    def test1(self, a, b, c):
        self.assertEqual(a + b, c)


if __name__ == '__main__':
    test_suite = unittest.TestSuite()
    test_suite.addTest(unittest.makeSuite(My))
    runner = xmlrunner.XMLTestRunner(output='report')  # 指定报告放的目录
    runner.run(test_suite)

原文地址: https://www.cnblogs.com/feng0815/p/8045850.html, 根据原文增加了一些说明与注释,如有侵权,请原作者联系删除