unittest框架

abdstime 2019-12-31

unittest框架

1、写用例:TestCase 类
2、加载用例:TestSuite 类    TestLoader 类
3、对比结果(执行结果/期望结果):assert函数
4、执行并出结果:TextTestRunner 类
5、报告:HtmlTestReport 类

1)首先建一个math_method.py文件,用来存在被测试函数

# 被测类函数
class MathMethod():

    def add(self, a, b):
        return a + b

    def sub(self, a, b):
        return a - b

2)新建一个test_case1.py文件,用来存放测试用例代码

# from unittest.case import TestCase  #在文件unittest文件下面case文件中存在TestCase模块
# class TestAdd(TestCase):

import unittest
from test_unittest.math_method import MathMethod  # 导入被测试类


class TestAdd(unittest.TestCase):  # 测试类  专门测试加法类
    # 写用例 每一条用例都是一个类函数
    # 用例 def test_后缀(self) :用例函数必须test开头

    def setUp(self):  # 测试环境的搭建
        print("我要开始测试咯")
        self.t = MathMethod()

    def tearDown(self):  # 测试环境的销毁
        print("我测试完成咯")

    def test_add_two_zero(self):  # 测试两个零相加的用例
        # t = MathMethod()  # 创建实例
        # res = t.add(0, 0)

        res = self.t.add(0, 0)
        # 断言函数的调用,注意:为啥用self,因为调用父类的方法
        self.assertEqual(1, res)
        print("测试的结果是:{0}".format(res))

    def test_add_two_positive(self):  # 测试两个整数相加的用例
        # t = MathMethod()  # 创建实例
        # res = t.add(4, 5)

        res = self.t.add(4, 5)
        print("测试的结果是:{0}".format(res))

    def test_add_two_negative(self):  # 测试两个负数相加的用例
        # t = MathMethod()  # 创建实例
        # res = t.add(-4, -5)

        res = self.t.add(-4, -5)
        print("测试的结果是:{0}".format(res))


class TestSub(unittest.TestCase):  # 测试类 专门测试减法
    # 写用例 每一条用例都是一个类函数
    # 用例 def test_后缀(self) :用例函数必须test开头

    def test_sub_two_zero(self):  # 测试两个零相减的用例
        t = MathMethod()  # 创建实例
        res = t.sub(0, 0)
        print("测试的结果是:{0}".format(res))

    def test_sub_two_positive(self):  # 测试两个整数相减的用例
        t = MathMethod()  # 创建实例
        res = t.sub(4, 5)
        print("测试的结果是:{0}".format(res))

    def test_sub_two_negative(self):  # 测试两个负数相减的用例
        t = MathMethod()  # 创建实例
        res = t.sub(-4, -5)
        print("测试的结果是:{0}".format(res))


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

3)新建一个test_suite.py文件,用来存放加载用例,执行用例,生成报告的代码

import unittest
from test_unittest.test_case1 import TestAdd  # 测试类
from test_unittest.test_case1 import TestSub  # 测试类
from test_unittest import test_case1  # 测试模块
import HTMLTestRunnerNew  # 生成html文件测试报告,这个文件放在lib文件里面
from test_unittest.test_case2 import TestAdd  # 测试类
from test_unittest import test_case2  # 测试模块
from test_unittest.read_config import ReadConfig  # 配置文件

from test_unittest.do_excel import DoExcel

# 加载测试用例
# suite:测试套件/测试用例的容器,这边suite是一个实例
suite = unittest.TestSuite()

# 怎么把测试用例放到测试套件suite里面去,以实例的形式添加进去

# # 方法一
# # suite.addTest()是suite实例调用父类的addTest的方法
# suite.addTest(TestAdd(-4, -5, 0, "test_add"))
# suite.addTest(TestAdd(‘test_add_two_positive‘))  #test_add_two_positive必须要加因为是父类的初始化参数

## 优化测试数据,方法1:参数化-测试数据列出来
# test_data = [[0, 0, 0, ‘两个0相加‘],
#              [1, 2, 3, ‘两个正数相加‘],
#              [-1, -4, -5, ‘两个负数相加‘],
#              [1, 0, 1, ‘一正一0相加‘],
#              [-1, 0, -1, ‘一负一0相加‘]]
# for item in test_data:
#     suite.addTest(TestAdd(item[0], item[1], item[2], item[3], ‘test_add‘))


# # 优化测试数据,方法2:调用测试数据,列表嵌套列表形式
# test_data=DoExcel().do_excel()
# for item in test_data:
#     suite.addTest(TestAdd(item[2], item[3], item[4], item[1], ‘test_add‘))


# # 优化测试数据,方法3:调用测试数据,列表嵌套字典形式
# test_data=DoExcel().do_excel()
# for item in test_data:
#     suite.addTest(TestAdd(item[‘Param_a‘], item[‘Param_b‘], item[‘ExceptedResult‘], item[‘title‘], ‘test_add‘))

# # 优化测试数据,方法4:调用测试数据,列表嵌套字典形式,但是要写回测试结果
# test_data=DoExcel().do_excel()
# for item in test_data:
#     suite.addTest(TestAdd(item[‘Param_a‘], item[‘Param_b‘], item[‘ExpectedResult‘], item[‘title‘], item[‘id‘] ,‘test_add‘))


# # 优化测试数据,方法5:结合配置文件,执行测试用例
# test_data = DoExcel().do_excel()
#
# #   实例化,获取mode和case_id_list
# mode = ReadConfig().read_config("case.config", "FLAG", "mode")
# case_id_list = eval(ReadConfig().read_config("case.config", "FLAG", "case_id_list"))
#
# if mode == "on":
#     final_data = test_data
# else:
#     final_data = []
#     for item in test_data:
#         if item[‘id‘] in case_id_list:
#             final_data.append(item)
#
# for item in final_data:
#     suite.addTest(
#         TestAdd(item[‘Param_a‘], item[‘Param_b‘], item[‘ExpectedResult‘], item[‘title‘], item[‘id‘], ‘test_add‘))


# 优化测试数据,方法6:结合配置文件,执行测试用例,判断放在读取文件中do_excel
#   实例化,获取mode和case_id_list
mode = ReadConfig().read_config("case.config", "FLAG", "mode")
case_id_list = eval(ReadConfig().read_config("case.config", "FLAG", "case_id_list"))

test_data = DoExcel().do_excel(mode, case_id_list)

for item in test_data:
    suite.addTest(
        TestAdd(item[‘Param_a‘], item[‘Param_b‘], item[‘ExpectedResult‘], item[‘title‘], item[‘id‘], ‘test_add‘))

# 方法二
# loader = unittest.TestLoader()
# 直接加载某个测试类里面的所有用例
# suite.addTest(loader.loadTestsFromTestCase(TestAdd))
# suite.addTest(loader.loadTestsFromTestCase(TestSub))

# 直接加载某个测试模块里面的用例
# suite.addTest(loader.loadTestsFromModule(test_case2))

# # 执行用例TextTestRunner 类 专门来执行suite测试套件里面的用例
# runner = unittest.TextTestRunner()   # 实例化
# # 使用实例化的run方法
# runner.run(suite)


# # 使用TextTestRunner可执行用例并且返回结果,优化生成txt格式报告
# with open("test_result.txt", ‘w+‘, encoding="utf-8") as f:
#     runer = unittest.TextTestRunner(f, verbosity=2)
#     runer.run(suite)


# 使用HTMLTestRunnerNew生成html格式的测试报告
# 优化生成html格式报告   使用二进制形式写入,不支持utf-8格式,故不需要写
with open(‘test_result.html‘, "wb+") as f:
    runer = HTMLTestRunnerNew.HTMLTestRunner(f, verbosity=2, title="测试报告", description=None, tester="xxx")
    runer.run(suite)

备注:

执行结果,如果鼠标放在某一个测试用例函数后面则只执行这个用例;若放在最后一行测试用例的下面则执行所有测试用例
执行结果顺序按照函数名ASCII码排序A-Z,0-9 test_add_two_negative test_add_two_positive test_add_two_zero
使用main函数则也是执行整个所有用例

相关推荐

deadgrape / 0评论 2020-05-25

lucialee / 0评论 2019-12-24