DDT ( Data-Driven Test) 参数化

DDT
    DDT ( Data-Driven Test) 是针对 unittest 单元测试框架设计的扩展库。 允许使用不同的测试数据来运行一个测试用例。
    pip install ddt  

pip install ddt

#如果 ddt 引用了  yaml  系统上要安装  pyyalm 
pip install pyyalm

 

  
---------------json文件-------------------------

{
    "case1": {"search_key": "python"},
    "case2": {"search_key": "selenium"},
    "case3": {"search_key": "unittest"}
}

 


-----------------------------------------------
----------------yaml文件--------------------------

case1:
  - "search_key": "python"
case2:
  - "search_key": "selenium"
case3:
  - "search_key": "unittest"

 


-----------------------------------------------

接下来创建运行文件test_baidu_data.py
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

import unittest
from time import sleep
from selenium import webdriver
from os.path import dirname, abspath
from ddt import ddt, data, unpack, file_data

@ddt
class TestBaidu(unittest.TestCase):

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

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

    def baidu_search(self, search_key):
        self.driver.get(self.baseUrl)
        self.driver.find_element_by_id("kw").send_keys(search_key)
        self.driver.find_element_by_id("su").click()

        sleep(2)


    # DDT 参数化使用方式一

    @data(
        ["case1", "selenium"],
        ["case2", "python"],
        ["case3", "unittest"],
        ["case4", "pytest"]
    )
    @unpack
    def test_search1(self, case, search_key):
        print("第一组测试用例是:", case)
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    @data(
        ("case1", "selenium"),
        ("case2", "python"),
        ("case3", "unittest"),
        ("case4", "pytest")
    )
    @unpack
    def test_search2(self, case, search_key):
        print("第二组测试用例是:", case)
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    @data(
        {"search_key": "selenium"},
        {"search_key": "python"},
        {"search_key": "unittest"},
        {"search_key": "pytest"}
    )
    @unpack
    def test_search3(self,  search_key):
        print("第三组测试用例是:", search_key)
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    baseDir = dirname(dirname(abspath(__file__)))
    dataFileDir = baseDir + '/datafile'
    jsonFilePath = dataFileDir + "/ddt_data_file.json"
    yamlFilePath = dataFileDir + "/ddt_data_file.yaml"

    @file_data(jsonFilePath)
    def test_search4(self, search_key):
        print("第四组测试用例:", search_key)
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    @file_data(yamlFilePath)
    def test_search5(self, case):
        search_key = case[0]["search_key"]
        print("第五组测试用例:", search_key)
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")
        
if __name__ == '__main__':
    unittest.main()

 



>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


----------------------运行结果----------------------------
第一组测试用例是: case1
.第一组测试用例是: case2
.第一组测试用例是: case3
.第一组测试用例是: case4
.第二组测试用例是: case1
.第二组测试用例是: case2
.第二组测试用例是: case3
.第二组测试用例是: case4
.第三组测试用例是: selenium
.第三组测试用例是: python
.第三组测试用例是: unittest
.第三组测试用例是: pytest
.第四组测试用例: python
.第四组测试用例: selenium
.第四组测试用例: unittest
.第五组测试用例: python
.第五组测试用例: selenium
.第五组测试用例: unittest
.
Ran 18 tests in 55.443s

OK

***Repl Closed***
----------------------------------------------------------------------


    使用 DDT 需要注意以下几点:
    首先: 测试类需要通过 @ddt 装饰器进行装饰

    其次: DDT 提供了不同形式的参数化。 这里列举了三组参数化, 第一组为列表,第二组为元组,第三章为字典。 需要注意的是,
字典的 key 与测试方法的参数要保持一致。


    DDt 同样支持数据文件的参数化。 它封装了数据文件的读取,让我们更专注于数据文件的内容,以及在测试用例中的使用,而不需
关心数据文件是如何被读取进来的
    
    yaml 的取值 与 json 有所不同,yaml 的每一条用例都被解析为 [{'search_key': 'python'}], 所以要想取得搜索文字,则
需要通过 case[0]['search_key'] 的方式获取

posted @ 2020-02-15 21:45  gupanpan  阅读(251)  评论(0)    收藏  举报