其他分享
首页 > 其他分享> > 【unittest单元测试框架】(7)DDT库

【unittest单元测试框架】(7)DDT库

作者:互联网

DDT库

DDT(Data-Driven Tests)是针对 unittest 单元测试框架设计的扩展库。允许使用不同的测试数据来运行一个测试用例,并将其展示为多个测试用例。 GitHub 地址:https://github.com/datadriventests/ddt DDT 支持 pip 安装
 pip install ddt

1、DDT基础用法

同样以百度搜索为例,来看看 DDT 的用法。创建 test_baidu_ddt.py 文件:

# -*- coding:utf-8 -*-
# filename: test_DdtBaidu.py
# author: hello.yin
# date: 2021/11/17 10:29

import unittest
from time import sleep
from selenium import webdriver
from ddt import ddt, data, unpack


@ddt
class TestBaidu(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Firefox()
        cls.base_url = "https://www.baidu.com"

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

    def baidu_search(self, search_key):
        self.driver.get(self.base_url)
        self.driver.find_element_by_id("kw").clear()
        self.driver.find_element_by_id("kw").send_keys(search_key)
        self.driver.find_element_by_id("su").click()
        sleep(3)

    # 第一种写法
    @data(["case1", "python"], ["case2", "php"], ["case3", "java"])
    @unpack
    def test_search1(self, case_name, search_key):
        print("开始执行第一个测试用例{}".format(case_name))
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    # 第二种写法
    @data(("case1", "mysql"), ("case2", "mongodb"), ("case3", "redis"))
    @unpack
    def test_search2(self, case_name, search_key):
        print("开始执行第二个测试用例{}".format(case_name))
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    # 第三种写法
    @data({"search_key": "c++"}, {"search_key":"c#"}, {"search_key": "html"})
    @unpack
    def test_search3(self, search_key):
        print("开始执行第三个测试用例{}".format(search_key))
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")


if __name__ == "__main__":
    unittest.main(verbosity=2)

创建runtest.py

# -*- coding:utf-8 -*-
# filename: run_test.py
# author: hello.yin
# date: 2021/11/17

import unittest

test_dir = "./test_case"

if __name__ == "__main__":
    suit = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suit)
  使用 DDT 需要注意以下几点。   首先,测试类需要通过@ddt 装饰器进行装饰。   其次,DDT 提供了不同形式的参数化。这里列举了三组参数化,第一组为列表,第二组为元组,第三组为字典。需要注意的是,字典的 key 与测试方法的参数要保持一致。   执行结果如下:
C:\Users\yzp\AppData\Local\Programs\Python\Python37\python.exe D:/00test/base_practice/test_case/run_test.py
test_search1_1___case1____python__ (ddt_test.test_DdtBaidu.TestBaidu) ... 开始执行第一个测试用例case1
ok
开始执行第一个测试用例case2
test_search1_2___case2____php__ (ddt_test.test_DdtBaidu.TestBaidu) ... ok
test_search1_3___case3____java__ (ddt_test.test_DdtBaidu.TestBaidu) ... 开始执行第一个测试用例case3
开始执行第二个测试用例case1
ok
test_search2_1___case1____mysql__ (ddt_test.test_DdtBaidu.TestBaidu) ... 开始执行第二个测试用例case2
ok
test_search2_2___case2____mongodb__ (ddt_test.test_DdtBaidu.TestBaidu) ... 开始执行第二个测试用例case3
ok
test_search2_3___case3____redis__ (ddt_test.test_DdtBaidu.TestBaidu) ... ok
test_search3_1 (ddt_test.test_DdtBaidu.TestBaidu) ... 开始执行第三个测试用例c++
ok
test_search3_2 (ddt_test.test_DdtBaidu.TestBaidu) ... 开始执行第三个测试用例c#
ok
开始执行第三个测试用例html
test_search3_3 (ddt_test.test_DdtBaidu.TestBaidu) ... ok

----------------------------------------------------------------------
Ran 9 tests in 61.007s

OK

Process finished with exit code 0

2、DDT文件参数化

  文件结构:

  DDT 同样支持数据文件的参数化。它封装了数据文件的读取,让我们更专注于数据文件中的内容,以及在测试用例中的使用,而不需要关心数据文件是如何被读取进来的。   创建 ddt_data_file.json 文件:

  创建ddt_data_file.yaml 文件:

test_baidu_ddt.py 文件中增加测试用例数据:

# -*- coding:utf-8 -*-
# filename: test_DdtBaidu.py
# author: hello.yin
# date: 2021/11/17 10:29

import unittest
from time import sleep
from selenium import webdriver
from ddt import ddt, data, unpack, file_data


@ddt
class TestBaidu(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Firefox()
        cls.base_url = "https://www.baidu.com"

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

    def baidu_search(self, search_key):
        self.driver.refresh()
        self.driver.get(self.base_url)
        self.driver.find_element_by_id("kw").clear()
        self.driver.find_element_by_id("kw").send_keys(search_key)
        self.driver.find_element_by_id("su").click()
        sleep(2)

    # 第一种写法
    @data(["case1", "python"], ["case2", "php"], ["case3", "java"])
    @unpack
    def test_search1(self, case_name, search_key):
        print("开始执行第一个测试用例{}".format(case_name))
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    # 第二种写法
    @data(("case1", "mysql"), ("case2", "mongodb"), ("case3", "redis"))
    @unpack
    def test_search2(self, case_name, search_key):
        print("开始执行第二个测试用例{}".format(case_name))
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    # 第三种写法
    @data({"search_key": "c++"}, {"search_key": "c#"}, {"search_key": "html"})
    @unpack
    def test_search3(self, search_key):
        print("开始执行第三个测试用例{}".format(search_key))
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    # 第四种方法,从json中获取参数
    @file_data("../test_data/ddt_data_file.json")
    def test_search4(self, search_key):
        print("开始执行第四个测试用例{}".format(search_key))
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    # 第五种方法,从yaml文件中获取参数
    @file_data("../test_data/ddt_data_file.yaml")
    def test_search5(self, case):
        print("开始执行第五个测试用例{}".format(case))
        search_key = case[0]["search_key"]
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")


if __name__ == "__main__":
    unittest.main(verbosity=2)
run_test.py生成测试报告:
# -*- coding:utf-8 -*-
# filename: run_test.py
# author: hello.yin
# date: 2021/11/17
import time
import unittest
from HTMLTestRunner import HTMLTestRunner

test_dir = "./test_case"
now_time = time.strftime("%Y%m%d%H%M%S")

if __name__ == "__main__":
    fp = open("./test_report/" + now_time + "_result.html", "wb")
    suit = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
    runner = HTMLTestRunner(stream=fp, title="baidu_search test", description="author:hello yin")
    runner.run(suit)

由于测试响应太频繁,触发了百度安全校验:

 

 

标签:__,search,unittest,单元测试,DDT,key,test,ddt,self
来源: https://www.cnblogs.com/yinzuopu/p/15566521.html