python 之 unittest+ddt

大家好,我是来自 python 自动化 13 期 A 组的夜雨声烦。我在上一篇(http://www.lemfix.com/topics/46) 文章整理了 unittest 的模板,但在后续学习中,发现还有许多值得优化的地方。例如在我们设计测试用例的时候,很多时候会出现测试步骤一样,只是其中的测试数据有变化而已。就比如测试登录时的账号密码。这个时候,如果我们依然使用一条 case 一个方法的话,会出现大量的代码冗余,而且效率也会大大降低。此时,ddt 模块就能帮助我们解决这个问题。ddt(data-driven test),顾名思义,数据驱动测试。这个模块是第三方库,需要我们自己下载。或者直接在命令行输入 pip install ddt。下载成功之后我们就能直接使用。基于 ddt 模块,我修改了上次整理的 unittest 模板,的确觉得代码清爽了很多。以下是基于 ddt 优化后的代码:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time     :2018/12/10 15:03
# @Author   :Yosef-夜雨声烦
# @Email    :wurz529@foxmail.com
# @File:    :learnddt.py
# @Software :PyCharm Community Edition

import unittest
from ddt import ddt, data, unpack
import HTMLTestRunner
import time

@ddt # 代表这个测试类使用了数据驱动ddt
class TestCases(unittest.TestCase):

    def setUp(self):
        print("*******************************")
        print("每一条case执行之前都会执行这个方法")

    def tearDown(self):
        print("每一条case执行之后都会执行这个方法\n")

    @data("hello", "123", " ")  # 代表传入的参数,一共三个参数,每次执行传一个值给value。
    def test_testcases1(self, value):
        print("这是一条测试用例case")
        try:
            self.assertTrue(value.isalpha())
            print("test pass")
        except Exception as e:
            print("出错啦,错误结果是%s" % e)
            print("test failed")
            raise e

    @data((1, 1), (1, 2), (1, 1.0)) # 代表传入的参数,一共三个参数,每次传入两个值,下面两个value分别来接收两个值。
    @unpack # 告诉我们的测试用例传入的是两个以上的值
    def test_testcases2(self, value1, value2):
        print("这是一条测试用例case")
        try:
            self.assertEqual(value1, value2)
            print("test pass")
        except Exception as e:
            print("出错啦,错误结果是%s" % e)
            print("test failed")
            raise e


# if __name__ == "__main__":
#     unittest.main()

suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestCases))

report_dir = "../Test report"
now = time.strftime("%Y-%m-%d %H-%M-%S")
reportname = report_dir + "/" + now + " Test report.html"

with open(reportname, "wb+") as file:
    runner = HTMLTestRunner.HTMLTestRunner(file, 2, title="Model test report",
                                           description="Hello testers! This is the description of Model test"
                                                       "report")
    runner.run(suite)

这是执行后的结果:
image.png

ddt 模块的更多操作使用等待大佬们去发现,我这里就不细说了。
当然,这只是在 unittest 模块上基于 ddt 模块的优化,在后面我将继续学习,做到测试数据与代码分离,然后会继续优化这个模板。
新手学习,不足之处肯定有,希望大佬们不吝赐教。

8 回帖
请输入回帖内容 ...
  • 88888888

    华华大佬是要催更嘛😆

  • 其他回帖
  • orang_qkbb

    数据驱动:testng 中的 dataprovider,嗯,殊途同归

  • huahua

    😎 这么优秀的同学,必须点赞

  • huahua

    大佬最近都不更新了·~~

  • 查看更多回帖