【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