python unittest的基本使用方法

在python中可以使用unittest做单元测试。unittest非常强大,本文以计算器的加、减、乘、除四则运算为例简单总结一下unittest的使用框架。

一、准备工作:

按如下方式创建工程:

python unittest的基本使用方法_第1张图片

my_calculator_fun.py  :测试类

my_calculator_fun_testcase.py:测试用例类

my_calculator_fun_testsuits.py:测试用例集类

my_calculator_fun_run.py:执行测试并生成报告

TestCase.log、TestResult.html、TestResult.txt :生成的测试报告(执行时使用了3种方法,故生成了3份报告)

二、代码实现

1、my_calculator_fun.py  :测试类

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @author: 陈所长

class MathMethod:
    def __init__(self,a,b):
        self.a = a
        self.b = b

    def add(self):
        """
        定义两个数的加法
        :return: 
        """
        return self.a + self.b

    def sub(self):
        """
        两个数的差
        :return: 
        """
        return self.a - self.b

    def division(self):
        """
        两个数的除法,除数不能为0
        :return:
        """
        try:
            return self.a / self.b
        except ZeroDivisionError as e:
            print("两数相除,除数不可为0")
            raise e

    def mul(self):
        """
        两个数的乘积
        :return:
        """
        return self.a * self.b

2、my_calculator_fun_testcase.py:测试用例类

# -*- coding: utf-8 -*-
# @author: 陈所长
import unittest
# import inspect
from class_11_unittest.homework_file.my_calculator_fun import MathMethod

class TestMathMethod(unittest.TestCase):
    """
    测试数学计算程序
    """
    def setUp(self):
        """
        重写父类的setUp方法,在每条用例执行之前都会调用
        :return:
        """
        self.file_name = 'TestCase.log'
        self.file = open(self.file_name,mode='a',encoding='utf8')
        self.file.write('{:*^40s}\n'.format('开始执行用例'))

    def test_two_num_add(self):  # 必须用test开头
        """
        测试两个数相加
        :return:
        """
        result = MathMethod(1,2).add()
        msg = '测试两个数相加失败'
        try:
            self.assertEqual(result,4,msg='测试失败')  # 使用断言语句,(语气结果,实际结果)进行比较
        except AssertionError as e:
            self.file.write("{},执行结果为:{}\n具体异常为:{}\n".format(msg, "Fail", e))
            raise e
        else:
            self.file.write("{},执行结果为:{}\n".format(msg, "Pass"))

    def test_two_num_sub(self):
        result = MathMethod(-1,-2).sub()
        msg = '执行两个数相减失败'
        try:
            self.assertEqual(result,1)
        except AssertionError as e:
            self.file.write("{},执行结果为:{}\n具体异常为:{}\n".format(msg, "Fail", e))
            raise e
        else:
            self.file.write("{},执行结果为:{}\n".format(msg, "Pass"))

    def test_two_num_mul(self):
        """
        测试两个数相乘
        :return:
        """
        result = MathMethod(2,-2).mul()
        msg = '执行两个数乘失败'
        try:
            self.assertEqual(result,2)
        except AssertionError as e:
            self.file.write("{},执行结果为:{}\n具体异常为:{}\n".format(msg, "Fail", e))
            raise e
        else:
            self.file.write("{},执行结果为:{}\n".format(msg, "Pass"))

    def test_two_num_division(self):
        """
        测试两个数相除
        :return:
        """
        result = MathMethod(2,-2).division()
        msg = '执行两个数相除失败'
        try:
            self.assertEqual(result,-1)
        except AssertionError as e:
            self.file.write("{},执行结果为:{}\n具体异常为:{}\n".format(msg, "Fail", e))
            raise e
        else:
            self.file.write("{},执行结果为:{}\n".format(msg, "Pass"))

    def tearDown(self):
        """
        重写父类的tearDown方法,每条用例执结束时会调用
        :return:
        """
        self.file.write('{:*^40s}\n\n'.format('执行用例结束'))
        self.file.close()


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

# 在一个测试类中,用例执行的顺序是按照实例方法名的ascii从小到大进行排序执行
# 鼠标点击在哪条用例上就执行哪条用例
# 如果使用try...catch...进行异常捕获,则所有的异常都会被统计,需要手动使用raise抛出异常
# unittest中的断言类型的种类

3、my_calculator_fun_testsuits.py:测试用例集类

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @author: 陈所长
import unittest
from class_11_unittest.homework_file.my_calculator_fun_testcase import TestMathMethod

# step1:创建测试套件
my_suit = unittest.TestSuite()

# step2:测试套件加载测试用例
# 第1种方法:通过测试对象加载
my_suit.addTest(TestMathMethod('test_two_num_add'))
# 第2种方法:通过测试类批量添加
my_suit.addTest(unittest.TestLoader().loadTestsFromTestCase(TestMathMethod))
# 第3种方法:通过测试模块批量进行加载
from class_11_unittest.homework_file import my_calculator_fun_testcase as test_module
my_suit.addTest(unittest.TestLoader().loadTestsFromModule(test_module))
# 第4种方法:通过测试用例名称添加
my_suit.addTest(unittest.TestLoader().loadTestsFromName('test_two_num_sub',test_module))
# 第5种方法:通过discover进行覆盖
my_suit.addTest(unittest.TestLoader().discover(r'D:\PythonPro\free_lemon_Python\class_11_unittest\homework_file',
                                               pattern='test_*',top_level_dir=None)
               )

4、my_calculator_fun_run.py:执行测试并生成报告

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @author: 陈所长
import unittest
# HTMLTestRunnerNew 需要自己从网上下载,下载完成之后放到 C:\Python37\Lib 下
import HTMLTestRunnerNew 
import class_11_unittest.homework_file.my_calculator_fun_testsuits as suit_1

# 1.直接执行,把日志打印在控制台
# runner_1 = unittest.TextTestRunner()
# runner_1.run(suit_1.my_suit)

# 2.生成TXT测试测试报告
# with open('TestResult.txt','w+') as ResultTxt:
#     runner_2 = unittest.TextTestRunner(ResultTxt,'这个是第二种方式生成的测试报告',2)
#     runner_2.run(suit_1.my_suit)

# 3.生成HTML报告
with open('TestResult.html','wb+') as f:
    runner_3 = HTMLTestRunnerNew.HTMLTestRunner(f,2,title='计算器测试报告',description='单元测试第一次',\
                                                tester='陈所长')
    runner_3.run(suit_1.my_suit)

三、生成的测试报告

使用的HTMLTestRunnerNew生成的测试报告截图如下:

python unittest的基本使用方法_第2张图片

按照以上方式即可把玩一下python的unittest,做一个简单的单元测试。

年轻人多吃泡面少说话。

python unittest的基本使用方法_第3张图片

你可能感兴趣的:(Python)