Python 中使用 ddt 來進行數據驅動,批量執行用例,修改ddt代碼


1. 什么是數據驅動? 使用數據驅動有什么好處?

  用例執行是靠數據來驅動的,每條測試用例除了測試數據不一樣意外,所有的用例代碼都是一樣的,為了使用例批量執行,我們會使用數據驅動的思想來批量執行測試用例;

  好處:

    批量的執行測試用例,提高執行的測試效率;數據與腳本分離,測試數據需要修改時,代碼不需要修改,只需要修改Excel文件的數據即可;

2. 數據驅動作用:

  根據用例的數量來自動生成實例方法, 批量執行用例

from ddt import ddt, data
from Python_0722_handle_config.handle_excel import HandleExcel   # Excel文件處理類

do_excel = HandleExcel("cases.xlsx", "multiply")
cases = do_excel.get_cases()    # cases 為嵌套字典的列表


@ddt        # ddt和data是黃金搭檔, 要一起使用才行,ddt來裝飾類
class TestMulti(unittest.TestCase):

    # 在文件中獲取測試用例,*cases()進行拆包,自動創建用例名稱:test_negative_multiply + 01
    # *cases 拆包后,會有四個字典,相當於data的位置參數,先去第一個位置參數給one_case
    # 1. 每迭代一次,會創建不同的實例方法;自動加01,用於遍歷執行所有測試用例
    # 1. 創建實例方法, 用於執行一條測試用例,一定要以test_開頭
    @data(*cases)
    def test_negative_multiply(self, one_case):
        。。。。。。。。
        。。。。。。。
        其他代碼

ddt總結:

  • 執行了多少條用例, 用例執行的條數與data裝飾器的(位置)參數的個數一致,每執行一條用例, 會自動將一個參數傳給one_case, 當最后一個參數傳給one_case, 且用例執行結束之后, 程序就會執行完畢
  • ddt和data是黃金搭檔, 要一起使用才行

4. 復制 ddt 源碼另存為,不建議在源碼上修改 

  修改 ddt 源碼107行,測試報告中的用例名不明確test_negative_multiply_01
  作用:

    如果數據是字典,則獲取字典當中的title對應的值,加到HTML測試報告名稱中

# 修改大概源碼107行的這個方法
def mk_test_name(name, value, index=0):
    """
    name:用例名/實例方法名
    value:用例數據字典
    """

    # Add zeros before index to keep order
    index = "{0:0{1}}".format(index + 1, index_len)

    # 注釋下面兩行
    # if not is_trivial(value):
    #     return "{0}_{1}".format(name, index)

    # 添加對字典數據的處理
    # 判斷如果不是字典類型,條件就不滿足;value不是字典類型則為假,就不會按原來拼接
    if not is_trivial(value) and not isinstance(value, dict):
        return "{0}_{1}".format(name, index)

    # 如果數據是字典,則獲取字典當中的title對應的值,加到測試用例名稱中
    if isinstance(value, dict):
        try:
            # 取出title值
            value = value["title"]
        except KeyError:
            return "{0}_{1}".format(name, index)

    try:
        value = str(value)      # 把title轉換為字符串類型
    except UnicodeEncodeError:
        # fallback for python2
        value = value.encode('ascii', 'backslashreplace')   # value是title名稱
    test_name = "{0}_{1}_{2}".format(name, index, value)    # 用例名稱拼接
    return re.sub(r'\W|^(?=\d)', '_', test_name)

 

 

*******請大家尊重原創,如要轉載,請注明出處:轉載自:https://www.cnblogs.com/shouhu/   謝謝!!******* 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM