ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-11-17 12:02:21  阅读:225  来源: 互联网

标签:__ search unittest 单元测试 DDT key test ddt self


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有