欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python unittest的基本使用方法

程序员文章站 2024-01-28 18:14:52
...

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

一、准备工作:

按如下方式创建工程:

python unittest的基本使用方法

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的基本使用方法

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

年轻人多吃泡面少说话。

python unittest的基本使用方法