pythonデータドライバ-ddt

16722 ワード

目次
  • 一、データ駆動紹介
  • 二、DDT基本使用紹介
  • 2.0テストベース
  • 2.1使用手順
  • 2.1 ddt単一データの読み出し
  • 2.2.1ケース
  • 2.2 ddtコンビネーション内のデータを読み出す(@unpack)
  • 2.2.1加unpack
  • 2.2.2 unpack
  • を追加しない
  • 2.3辞書
  • を読み取る
  • 三、DDTとExcel結合
  • 3.1 excel解析クラス書き方
  • 3.2 ddtとexcelの結合例

  • 一、データ駆動の紹介
    データ駆動、私の理解、簡単な点は、データテストデータのパラメータ化です.
    二、DDT基本使用紹介
    2.0ベースクラスのテスト
    class Test:
        def __init__(self, a, b):
            self.a = a
            self.b = b
    
        def add(self):
            return self.a + self.b
    
        def sub(self):
            return self.a - self.b
    
        def multi(self):
            return self.a * self.b
    
        def div(self):
            return self.a / self.b

    2.1使用手順
  • パイロット
  • from ddt import ddt, data, unpack
  • ddt
  • を使用
    2.1 ddt単一データの読み出し
    この方式はあまり応用されていない.
    2.2.1ケース
    @ddt
    class TestExample0428(unittest.TestCase):
        def setUp(self):
            pass
    
        @data(1, 2, 3)
        def test_add(self, *args, **kwargs):
            print(*args)

    3回印刷し、それぞれ1、2、3
    2.2 ddtコンビネーション内のデータの読み出し(@unpack)
    この方式は比較的一般的な方式であり,多パラメータ用例のパラメータ化を実現できる.
    2.2.1加unpack
    @ddt
    class TestExample0428(unittest.TestCase):
        def setUp(self):
            pass
    
        @data((1, 2, 3), (2, 3, 5), (1, 1, 1))
        @unpack
        def test_dict(self, *args, **kwargs):
            print("      ")
            # print(*args, **kwargs)
            print(*args)

    印刷結果
          
    1 2 3
          
    2 3 5
          
    1 1 1

    2.2.2 unpackなし
    @ddt
    class TestExample0428(unittest.TestCase):
        def setUp(self):
            pass
    
        @data((1, 2, 3), (2, 3, 5), (1, 1, 1))
        def test_dict(self, *args, **kwargs):
            print("      ")
            # print(*args, **kwargs)
            print(*args)

    印刷結果
          
    (1, 2, 3)
          
    (2, 3, 5)
          
    (1, 1, 1)

    2.3辞書の読み取り
    @ddt
    class TestExample0428(unittest.TestCase):
        def setUp(self):
            pass
    
        @data({"name":"gupan", "length":"170cm"}, {"age":"12"})
        def test_dict(self, *args, **kwargs):
            print("      ")
            print(*args, **kwargs)

    印刷結果
          
    {'name': 'gupan', 'length': '170cm'}
          
    {'age': '12'}

    三、DDTとExcelの結合
    3.1 excel解析クラスの書き方
    # -*- coding:utf-8 -*-
    # __author__ = 'gupan'
    
    from config import settings
    import os
    import sys
    from src.utils import utils
    import xlrd
    import traceback
    
    class ExcelParse:
        """
        EXCEL   
    
        self.file_path:        
        self.workbook:   excel  
        self.sheet_obj:       
        self.nrows:        
        self.ncols:        
    
        __init__(self, file_path):
        aquire_cell_data(self, row, col):          ,   -1
        heads(self, *args, **kwargs):        
        aquire_methodName_col(self):       
        aquire_each_col_type(self):             
        datas(self, *args, **kwargs):         ,          
        """
    
        def __init__(self, file_path):
            '''
            :param file_path:         
            '''
            self.file_path = file_path
            if not os.path.exists(self.file_path):
                utils.print_log_error(self.file_path + "   ,     !!!!!")
                sys.exit(1)
            try:
                self.workbook = xlrd.open_workbook(self.file_path)
            except Exception as err:
                utils.print_log_error("    xls     
    "
    ) utils.print_log_error(traceback.format_exc()) raise err # Excel , , self.sheet_obj = self.workbook.sheets()[0] # self.nrows = self.sheet_obj.nrows # self.ncols = self.sheet_obj.ncols if self.nrows == 1 or self.ncols == 0: utils.print_log_error(file_path + " , !!!!!") sys.exit(1) def aquire_cell_data(self, row, col): ''' :param row: ( -1) :param col: ( -1) :return: (str ) ''' return self.sheet_obj.cell_value(row - 1,col - 1) def heads(self, *args, **kwargs): ''' :param args: :param kwargs: :return: ''' heads_info = [] for col in range(0, self.ncols): heads_info.append(self.sheet_obj.cell_value(0, col)) return heads_info def aquire_methodName_col(self): ''' :return: ''' heads = self.heads() try: idx = heads.index(settings.method_desc) except IndexError as err: utils.print_log_error(self.file_path+" "+settings.method_desc + '
    '
    ) utils.print_log_error(traceback.format_exc()) raise err return idx def aquire_each_col_type(self): ''' :return: , ''' col_type_desc_list = [] for col in range(0, self.ncols): col_type_desc_list.append(self.sheet_obj.cell_value(settings.desc_type_row - 1, col)) return col_type_desc_list def datas(self, *args, **kwargs): ''' , :param args: :param kwargs: :return: , key ''' test_datas = {} # data_begin_col = settings.data_begin_col - 1 # data_begin_row = settings.data_begin_row - 1 # type_list = self.aquire_each_col_type() # method_col = self.aquire_methodName_col() # pre_method_name = self.sheet_obj.cell_value(data_begin_row, method_col) # method method_datas = [] method_count = 0 # , for row in range(settings.data_begin_row - 1, self.nrows): row_data = [] cur_method_name = self.sheet_obj.cell_value(row, method_col) # for col in range(data_begin_col, self.ncols): type_desc = type_list[col] cell_data = self.sheet_obj.cell_value(row, col) cell_data = utils.type_switch(cell_data, type_desc) row_data.append(cell_data) if pre_method_name == cur_method_name: method_datas.append(row_data) method_count += 1 else: test_datas[pre_method_name] = method_datas.copy() # , method_datas.clear() method_count = 0 pre_method_name = cur_method_name method_datas.append(row_data) # 0 if method_count != 0: test_datas[pre_method_name] = method_datas return test_datas

    3.2 ddtとexcelの結合例
    @ddt
    class TestExample0428(unittest.TestCase):
        def setUp(self):
            pass
        @data(*test_datas['test_add'])
        @unpack
        def test_add(self, *args, **kwargs):
            p1, p2, value = args
            result = Test(p1, p2).add()
            try:
                self.assertEqual(result, value, "    ,     ")
                utils.print_log_info("      ")
            except AssertionError as err:
                err_str = traceback.format_exc()
                utils.print_log_error(err_str)
                raise err

    テスト結果
    test_add_1__2__2__4_ (src.test.case.testExample.TestExample0428) ...       
    ok
          
    test_add_2__2__2__4_ (src.test.case.testExample.TestExample0428) ... ok
          
    test_add_3__3__3__6_ (src.test.case.testExample.TestExample0428) ... ok
          
    test_add_4__4__4__8_ (src.test.case.testExample.TestExample0428) ... ok
    test_dict (src.test.case.testExample.TestExample0428) ... ok
    test_div (src.test.case.testExample.TestExample0428) ... ok
    test_multi (src.test.case.testExample.TestExample0428) ... ok
    test_sub (src.test.case.testExample.TestExample0428) ... ok