浅谈Unittest框架之DDT

  • Post author:
  • Post category:其他


DDT(Data-Driven Tests) 是针对unittest单元测试框架设计的扩展库。允许使用不同的测试数据来运行一个测试用例,并将其展示为多个测试用例

示例代码:

import unittest

from time import sleep

from selenium import webdriver

from ddt import ddt,data,file_data,unpack

@ddt
class TestBaidu(unittest.TestCase):

    @classmethod
    def setUpClass(cls):

        cls.driver=webdriver.Chrome()

        cls.base_url="https://www.baidu.com/"

    def baidu_search(self,search_key):

        self.driver.get(self.base_url)

        self.driver.find_element_by_id("kw").send_keys(search_key)

        self.driver.find_element_by_id("su").click()

        sleep(3)

    #参数化使用方式一(读取列表数据)
    @data(["case1","selenium"],["case2","ddt"],["case3","python"])

    @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", "ddt"), ("case3", "python"))

    @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":"ddt"}, {"search_key":"python"})
     #若测试方法有多个参数,则应写成:
    @data({"search_key":"selenium","key","test"}, {"search_key":"ddt","key","test"
}, {"search_key":"python","key","test"})

    @unpack
    def test_search3(self, search_key):

        print("第三组测试用例", search_key)

        self.baidu_search(search_key)

        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    #参数化使用方式四(读取Json文件)
    #ddt_data_file.json文件内容如下:
    # {
    #     "case1": {"search_key": "python"},
    #     "case2": {"search_key": "ddt"},
    #     "case3": {"search_key": "Selenium"}
    # }

    @file_data("ddt_data_file.json")
    def test_search4(self,search_key):

        print("第四组测试用例", search_key)

        self.baidu_search(search_key)

        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    # 参数化使用方式五(读取yaml文件)
    #ddt_data_file.yaml文件内容如下
    # case1:
    #    -search_key: "python"
    # case2:
    #    -search_key: "ddt"
    # case3:
    #    -search_key: "unittest"

    @file_data("ddt_data_file.yaml")
    def test_search5(self, case):

        search_key=case[0]["search_key"]#与解析json文件的不同之处
   
        print("第五组测试用例", search_key)

        self.baidu_search(search_key)

        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    @classmethod
    def tearDownClass(cls):

        cls.driver.quit()

if __name__=="__main__":

   unittest.main(verbosity=2)

注意事项:

1.如使用DDT,测试类需要通过@ddt装饰器进行装饰

2.DDT可提供不同数据类型参数化,本例列举了列表、元组、字典三种类型。若使用字典的话,字典的key需与参数保持一致。

3.DDT支持数据文件参数化,参考方式四、五分别为读取json文件、yaml数据文件。若数据文件与测试文件不在同一目录下,需指定数据文件路径



版权声明:本文为xiaoxiao_chen945原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。