Frame--unittest+单测

1. 单元测试简介
1.1 本质
面向对象:封装->类---类属性+类方法/类函数
单元测试的本质---对类函数/方法进行测试
1.2 单元测试框架
unittest
pytest
ddt    ---参数化
1.3 参考资料
https://www.cnblogs.com/fennudexiaoniao/p/7771931.html
2. unittest框架
2.1 框架介绍
1. TestCase(测试用例):编写测试用例

2. TestSuite(测试套件):放置测试用例的容器,以备执行

3. TestLoder:是用来加载 TestCase到TestSuite中

4. TextTestRunner:是来执行测试用例的

5. TextTestResult:测试结果会保存到TextTestResult实例中

6. TestFixture:测试代码的运行环境,包括setUp和tearDown方法
2.2 测试原理

在这里插入图片描述
TestLoader加载TestCase到TestSuite中,然后TestRunner运行测试用例,生成的结果保存到TextTestResult中。整个过程集成在unittest.main模块中

2.3 测试流程
1. 编写TestCase:
    继承自unittest.TestCase
    方法须以test开头
    设置断言:self.assertEqual(res, 0)
    运行单元测试:unittest.main()

2. 由TestLoder加载TestCase到TestSuite

3. 然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中。
2.4 测试准备
  1. HTMLTestRunnerNew.py测试报告模板安装
    下载链接:链接:https://pan.baidu.com/s/1bGBh4jyiheIz1YARExUgWA
    提取码:z13q。下载完成后将文件放在项目目录下或项目运行环境下的Lib目录中。使用时import HTMLTestRunnerNew即可
2.5 代码
  • code.py
class Add:
    def add(self, a, b):
        return a + b
  • test_case.py
import unittest
from zy.Code import Add


class TestAdd(unittest.TestCase):   # 测试用例必须继承自父类

    def setUp(self):        # 初始化测试环境
        print('Start')
        self.t = Add()

    def tearDown(self):     # 还原测试环境
        print('End')

    def test_add_two_positive(self):
        r = self.t.add(1, 3)
        try:                           # 异常处理
            self.assertEqual(r, -4)    # 添加断言,取自父类
        except AssertionError as e:
            print('Fail')
            raise e                    # 抛出异常
        print('测试结果是{}'.format(r))

    def test_add_two_negative(self):
        r = self.t.add(-1, -3)
        self.assertEqual(r, -4)
        print('测试结果是{}'.format(r))

    def test_add_two_zero(self):
        r = self.t.add(0, 0)
        self.assertEqual(r, 0)
        print('测试结果是{}'.format(r))


# 运行测试用例
if __name__ == '__main__':
    unittest.main()

  • execute_case.py
import unittest
from zy.test_case import TestAdd   # 导入测试类

# 创建测试套件
suite = unittest.TestSuite()   # 实例化即可

# 添加用例

# 方法一:单一添加用例
suite.addTest(TestAdd('test_add_two_positive'))
suite.addTest(TestAdd('test_add_two_negative'))

# 方法二:批量添加用例
from zy import test_case

loader = unittest.TestLoader()

suite.addTest(loader.loadTestsFromTestCase(TestAdd))  # 加载测试类里的所有用例
suite.addTest(loader.loadTestsFromModule(test_case))  # 加载模块里的所有用例

# 执行用例并生成报告

# 方法一:txt格式报告
with open('TestResult.txt', 'w+', encoding='utf-8') as f:
    runner = unittest.TextTestRunner(f, descriptions='20180929', verbosity=2)   # verbosity=1/2,参数2报告更详细
    runner.run(suite)       # 执行测试用例

# 方法二:引入HTMLTestRunnerNew模块生成Html格式报告
import HTMLTestRunnerNew

with open('TestResult.html','wb+') as f:
    runner = HTMLTestRunnerNew.HTMLTestRunner(f, title='zy-TestReport', description='20180929', tester='zy')
    runner.run(suite)


3. 参数化
利用初始化函数进行参数化
  • test_case.py
import unittest
from zy.Code import Add


class TestAdd(unittest.TestCase):   # 测试用例必须继承自父类
    def setUp(self):        # 初始化测试环境
        print('Start')
        self.t = Add()

    def __init__(self, a, b, expected, methodName): # 参数化,初始化传参
        super(TestAdd, self).__init__(methodName)    # 超继承
        self.a = a
        self.b = b
        self.expected = expected

    def tearDown(self):     # 还原测试环境
        print('End')

    def test_add(self):
        r = self.t.add(self.a, self.b)
        try:                           # 异常处理
            self.assertEqual(r, self.expected)    # 添加断言,取自父类
        except AssertionError as e:
            print('Fail')
            raise e                    # 抛出异常
        print('测试结果是{}'.format(r))

    # def test_add_two_negative(self):
    #     r = self.t.add(-1, -3)
    #     self.assertEqual(r, -4)
    #     print('测试结果是{}'.format(r))
    #
    # def test_add_two_zero(self):
    #     r = self.t.add(0, 0)
    #     self.assertEqual(r, 0)
    #     print('测试结果是{}'.format(r))


# 运行测试用例
if __name__ == '__main__':
    unittest.main()
  • execute_case.py
import unittest
from zy.test_case import TestAdd   # 导入测试类
import HTMLTestRunnerNew

# 测试数据
test_data = [[1, 2, 3, '两个整数相加'],
             [-1, -2, -3, '两个整数相加'],
             [0, 0, 0, '两个零相加'],
             [0, 1, 1, '一正一零相加'],
             [0, -1, -1, '一负一零相加']]

# 创建测试套件
suite = unittest.TestSuite()   # 实例化即可

# 添加用例

# suite.addTest(TestAdd(4, 3, 7, 'test_add'))
for i in test_data:
    print('正在执行{}'.format(i[3]))
    suite.addTest(TestAdd(i[0], i[1], i[2], 'test_add'))


# 执行用例并生成报告
# 方法二:引入HTMLTestRunnerNew模块生成Html格式报告


with open('TestResult.html','wb+') as f:
    runner = HTMLTestRunnerNew.HTMLTestRunner(f, title='zy-TestReport', description='20180929', tester='zy')
    runner.run(suite)

3.2 excel读取
import openpyxl

class DoExcel:
    # 读取测试数据
    def do_excel(self):
        wb = openpyxl.load_workbook('zy001.xlsx')
        sheet = wb['table1']
        
        # 读取列表头
        header = []
        for i in range(1, 4):
            n = sheet.cell(1, i).value
            header.append(n)

        # 读取值
        data = []
        for i in range(2,4):
            dict = {}
            for j in range(1,4):
                dict[header[j-1]] = sheet.cell(i, j).value
            data.append(dict)
        return data

    # 回写测试结果
    def write_back(self):
        wb = openpyxl.load_workbook('zy001.xlsx')
        sheet = wb['table1']
        sheet.cell(4, 1).value = 12
        wb.save('zy001.xlsx')

if __name__ == '__main__':
    test_data=DoExcel().do_excel()
    r = DoExcel().write_back()
    print(test_data)
4. 整体代码
## code
class Sub:
    def sub(self, a, b):
        return a - b

## test_case
import unittest
from zy.code import Sub
from zy.do_excel import DoExcel


class TestSub(unittest.TestCase):
    def setUp(self):
        self.t = Sub()
        self.wb = DoExcel()

    def __init__(self, a, b, expected, title, case_id, methodName):
        super(TestSub, self).__init__(methodName)    ## 超继承
        self.a = a
        self.b = b
        self.expected = expected
        self.title = title
        self.case_id = case_id  ## 使用case_id避免重复

    def tearDown(self):
        pass

    def test_sub(self):
        print('用例标题:{}'.format(self.title))
        res = self.t.sub(self.a, self.b)
        try:
            self.assertEqual(res, self.expected)
            test_result = 'PASS'
        except AssertionError as e:
            test_result = 'FAIL'
            raise e
        finally:
            self.wb.write_back(self.case_id+1, res, test_result)


## suite
import unittest
from zy.test_case import TestSub
from zy.do_excel import DoExcel
import HTMLTestRunnerNew

test_data = DoExcel().read_data()

suite = unittest.TestSuite()
for item in test_data:
    suite.addTest(TestSub(item['param_a'], item['param_b'], item['ExpectedResult'], item['title'], item['case_id'], 'test_sub'))

with open('TestResult.html', 'wb+') as file:
    runner = HTMLTestRunnerNew.HTMLTestRunner(file, title='减法测试', description='第二轮整体回归测试减法方法的正确性', tester='华杰-zy')
    runner.run(suite)
## do_excel
import openpyxl

class DoExcel:
    def read_data(self):
        wb = openpyxl.load_workbook('test_data.xlsx')
        sheet = wb['model1']
        header = []
        for column in range(1, 6):
            header.append(sheet.cell(1, column).value)

        test_data = []
        for row_id  in range(2, 10):
            row_data = {}
            for column_id in range(1, 6):
                row_data[header[column_id-1]] = sheet.cell(row_id, column_id).value
            test_data.append(row_data)
        return test_data

    def write_back(self, row_id, ActualResult, TestResult):
        wb = openpyxl.load_workbook('test_data.xlsx')
        sheet = wb['model1']
        sheet.cell(row_id, 6).value = ActualResult
        sheet.cell(row_id, 7).value = TestResult
        wb.save('test_data.xlsx')


if __name__ == '__main__':
    test_data = DoExcel().read_data()
    print(test_data)

5. 测试报告
5.1 报告样式

在这里插入图片描述

5.2 测试报告库文件-HTMLTestRunnerNew.py

下载链接: https://pan.baidu.com/s/1rZ1BFWraqgUKszKzBFpQnw 密码: 9eqt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值