3.2 unittest框架 -- ddt数据驱动的引入

    第二篇上一节的内容,我们在进行注册函数的逻辑测试时,写了6个测试函数,我们发现所有测试函数中只有data和expect_result不一样,其他内容都一样,那我们就想想函数的作用是什么?是实现一个功能,当不同参数函数的结果也不一样时,那我们就可以将这些参数可以作为函数参数传入

如上一节内容,既然只有data和expect_result不一样,那么我们就可以

1.   将所有的测试数据存在一个变量中

testcase = [[['Luji', '1234567'], {'code': 2, 'msg': '用户名长度须在6-15内'}],
            [['1234567890123456', '1234567'], {'code': 2, 'msg': '用户名长度须在6-15内'}],
            [['Lujier', '1234567'], {'code': 1, 'msg': '该用户名已被使用'}],
            [['Lujier001', '12345'], {'code': 3, 'msg': '密码长度须在6-20内'}],
            [['Lujier001', '123456789012345678901'], {'code': 3, 'msg': '密码长度须在6-20内'}],
            [['Lujier001', '1234567'], {'code': 0, 'msg': '注册成功'}]
            ]

2.   在定义测试函数时,则将data和expect_result作为该函数参数(test_regiater.py)

     

class TestRegister(unittest.TestCase):

    def setUp(self):
        print("每一条用例执行开始")

    def tearDown(self):
        print("每一条用例执行开始")

    def test_register(self, data, expect_result):

        actual_result = register(*data)  # 测试结果
        try:
            # 断言处理
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:
            print("用例执行失败,原因:{}!".format(msg))
            raise msg
        else:
            print("用例执行成功")
3.  测试用例集文件run_suite.py如下内容:
import unittest
from CSDN.test_register import TestRegister
from HTMLTestRunnerNew import HTMLTestRunner

'''创建一个测试套件'''
suite = unittest.TestSuite()
# 用例测试数据,
testcases = [[['Luji', '1234567'], {'code': 2, 'msg': '用户名长度须在6-15内'}],
             [['1234567890123456', '1234567'], {'code': 2, 'msg': '用户名长度须在6-15内'}],
             [['Lujier', '1234567'], {'code': 1, 'msg': '该用户名已被使用'}],
             [['Lujier001', '12345'], {'code': 3, 'msg': '密码长度须在6-20内'}],
             [['Lujier001', '123456789012345678901'], {'code': 3, 'msg': '密码长度须在6-20内'}],
             [['Lujier001', '1234567'], {'code': 0, 'msg': '注册成功'}]
             ]
for case in testcases:
    suite.addTest(TestRegister('test_register', case[0], case[1]))
# 3. HTMLTestRunnerNew 测试报告
with open("test_report.html", "wb") as f:
    runner = HTMLTestRunner(
        stream=f,
        verbosity=0,
        title="test reports",
        description="",
        tester="Lujier")
    runner.run(suite)

   但是,存在一个问题那就是,我们一般进行测试时,会有很多的测试模块,这样就导致

          1)   run_suite.py文件可能内容过多;

           2)  如果测试数据出错,就需要进入run_suite中,找到问题模块的数据,代码较多情况下,不好定位

   那么如何解决呢?

           在这里,我们就要开始引入ddt了, 我们可以将测试数据放在对应的测试模块中,测试模块内容如下:

test_register.py

import unittest
from ddt import data,ddt

@ddt
class TestRegister(unittest.TestCase):
    # 用例测试数据,

    testcases = [[['Luji', '1234567'], {'code': 2, 'msg': '用户名长度须在6-15内'}],
                 [['1234567890123456', '1234567'], {'code': 2, 'msg': '用户名长度须在6-15内'}],
                 [['Lujier', '1234567'], {'code': 1, 'msg': '该用户名已被使用'}],
                 [['Lujier001', '12345'], {'code': 3, 'msg': '密码长度须在6-20内'}],
                 [['Lujier001', '123456789012345678901'], {'code': 3, 'msg': '密码长度须在6-20内'}],
                 [['Lujier001', '1234567'], {'code': 0, 'msg': '注册成功'}]
                 ]
    def setUp(self):
        print("每一条用例执行开始")

    def tearDown(self):
        print("每一条用例执行开始")
        
    @data(*testcases)
    def test_login(self, testcase):
        datacontent = testcase[0]   # 测试数据
        expect_result = testcase[1]  # 预期结果
        actual_result = register(*datacontent)  # 测试结果
        try:
            # 断言处理
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:
            print("用例测试失败,原因:{}!".format(msg))
            raise msg
        else:
            print("用例执行成功")

那自然的,run_suite文件内容就跟上一节的内容一样喽

import unittest
from CSDN.test_register import TestRegister
from HTMLTestRunnerNew import HTMLTestRunner

'''创建一个测试套件'''
suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestLogin))

# 3. HTMLTestRunnerNew 测试报告
with open("test_report.html", "wb") as f:
    runner = HTMLTestRunner(
        stream=f,
        verbosity=0,
        title="test reports",
        description="",
        tester="Lujier")
    runner.run(suite)

运行结果如下:

3.2 unittest框架 -- ddt数据驱动的引入_第1张图片

你可能感兴趣的:(Python自动化测试,自动化测试框架介绍,ddt数据驱动,unittest单元测试,unittest用例收集)