1. 程式人生 > >ddt原始碼修改:HtmlTestRunner報告依據介面名顯示用例名字

ddt原始碼修改:HtmlTestRunner報告依據介面名顯示用例名字

背景是這樣的:

  自己寫了一套介面自動化的框架,其中使用unittest + ddt + excel作為資料驅動模式的應用,使用HtmlTetstRunner來生成測試用例。

        一切看起來很完美。

        但是,發現測試報告中,測試用例名稱都是:test_api_index.index表示用例的編號,從1開始,遞增。比如:test_api_01、test_api_02......test_api_0N

        希望能在不同的用例名稱當中,顯示相應的介面用例名字。比如登陸介面的成功登陸用例:測試報告中用例名稱顯示為test_login_success。密碼錯誤的用例名稱為:test_login_wrongPasswd

        這樣,我直接從報告中就可以知道是哪個介面的哪個用例失敗了,一目瞭然。

       於是,就開始琢磨這事兒了。。。

======================================背景分割線============================================

        一琢磨就琢磨到ddt原始碼上去了。心中有一個疑惑:

       1、為什麼我的測試用例名稱是這樣的??

        查看了ddt原始碼之後,發現有個函式是用來生成測試用例名字的。這個函式叫:mk_test_name

  它是如何來生成測試用例名字的呢?

        它接受兩個引數:name 和 value.

         name:為單元測試中,測試用例的名字。即test_api.

         value:為測試資料。ddt是處理一組測試資料。而這個value就是這一組資料中的每一個測試資料。

                     對value的值是有限制的:要麼就是單值變數,要麼就是元組或者列表並且要求元組和列表中的資料都是單值變數。如("name","port") 、["name","port"]

         如果傳進來的測試資料,不符合value的要求,那麼測試用例名字為:name_index。

         如果傳進來的測試資料,符合value的要求,那麼測試用例名字為:name_index_value。如果value為列表或者元組,那麼將列表/元組的每個資料依次追加在末尾。

         比如傳進來的name值為test_login,value值為["name","port"]。那最終的測試用例名字是:test_login_01_name_port。

         如果傳進來的name值為test_login,value值為{"name":"login","port":2204},那最終的測試用例名字為:test_login_01。因為它不支援對字典型別的資料處理。

         很不巧,我的介面自動化框架中,ddt處理的資料是一列表:列表當中每個資料都為字典。ddt一遍歷整個列表,那傳給value的值剛好是字典。。

        so。。。我得到的測試用例名稱就是:test_api_01,test_api_02,test_api_03..........test_api_0N

def mk_test_name(name, value, index=0):
    """
    Generate a new name for a test case.
 
    It will take the original test name and append an ordinal index and a
    string representation of the value, and convert the result into a valid
    python identifier by replacing extraneous characters with ``_``.
 
    We avoid doing str(value) if dealing with non-trivial values.
    The problem is possible different names with different runs, e.g.
    different order of dictionary keys (see PYTHONHASHSEED) or dealing
    with mock objects.
    Trivial scalar values are passed as is.
 
    A "trivial" value is a plain scalar, or a tuple or list consisting
    only of trivial values.

    """
    
    # Add zeros before index to keep order
    index = "{0:0{1}}".format(index + 1, index_len)
    if not is_trivial(value):    #如果不符合value的要求,則直接返回用例名稱_下標作為最終測試用例名字。
        return "{0}_{1}".format(name, index)

    try:
        value = str(value)
    except UnicodeEncodeError:
        # fallback for python2
        value = value.encode('ascii', 'backslashreplace')
    test_name = "{0}_{1}_{2}".format(name, index, value)
    return re.sub(r'\W|^(?=\d)', '_', test_name)

2、修改ddt原始碼,顯示測試用例名字

       為了讓我的測試報告,呈現的更好。那就改改ddt原始碼,讓它能夠適應我的框架。

       考慮兩個問題:

        1、不同介面的測試用例名字如何來??

        2、如何讓ddt支援對字典的處理??

        解決方法:

        第一個問題:每一個測試用例主動提供一個用例名字,說明你是什麼介面的什麼場景用例。比如:介面名_場景名。login_success、login_noPasswd、login_wrongPasswd等。

        在我的框架當中,每一個測試用例是一個字典。那麼我就在字典中新增一個鍵值對,case_name=用例名稱

  第二個問題:在ddt中新增對字典的處理,如果字典中有case_name欄位,則將字典中鍵名為case_name的值作為測試用例名稱中的value值。

       修改後的ddt原始碼為(紅色粗體部分為修改的內容):

def mk_test_name(name, value, index=0):

    print("-------first value------------")
    print(value)
    # Add zeros before index to keep order
    index = "{0:0{1}}".format(index + 1, index_len)
    #添加了對字典資料的處理。
    if not is_trivial(value) and type(value) is not dict:
        return "{0}_{1}".format(name, index)
    #如果資料是字典,則獲取字典當中的api_name對應的值,加到測試用例名稱中。
    if type(value) is dict:
        try:
            value = value["case_name"]   #case_name作為value值
        except:
            return "{0}_{1}".format(name, index)

    try:
        value = str(value)
    except UnicodeEncodeError:
        # fallback for python2
        value = value.encode('ascii', 'backslashreplace')
    test_name = "{0}_{1}_{2}".format(name, index, value)

    return re.sub(r'\W|^(?=\d)', '_', test_name)

修改完成之後,再次執行介面測試,就可以在測試報告當中看到對應的用例名字啦。。

相關推薦

轉載 ddt原始碼修改HtmlTestRunner報告依據介面顯示名字

背景是這樣的:   自己寫了一套介面自動化的框架,其中使用unittest + ddt + excel作為資料驅動模式的應用,使用HtmlTetstRunner來生成測試用例。         一切看起來很完美。     &

ddt原始碼修改HtmlTestRunner報告依據介面顯示名字

背景是這樣的:   自己寫了一套介面自動化的框架,其中使用unittest + ddt + excel作為資料驅動模式的應用,使用HtmlTetstRunner來生成測試用例。         一切看起來很完美。         但是,發現測試報告中,測試用例名稱都是:

geth原始碼修改取消呼叫智慧合約的gas費用

1 問題的提出 在聯盟鏈裡,有需求是普通的轉賬ether可以收取交易gas,釋出或呼叫智慧合約不需要gas費用。在私鏈環境下,如果智慧合約呼叫是私鏈官方者的行為,則希望智慧合約不收取gas費用。所謂的普通轉賬,就是在web3裡面通過eth.sendTransaction({

行為驅動Cucumber + Selenium + Java(四) - 實現測試的參數化

pac webdriver tab back condition ons 直接 wait feature 在上一篇中,我們介紹了Selenium + Cucumber + Java框架下的使用Tags對測試用例分組的實現方法,這一篇我們用數據表格來實現測試用例參數化。

介面測試的設計

一.介面測試的範圍 1.功能測試 等價類劃分法 邊界值分析法 錯誤推斷法 因果圖法 判定表驅動法 正交試驗法 功能圖法 場景法 2.異常測試 資料異常 null “”

測試 -介面測試-測試編寫

一、.介面功能測試的測試方案規格建議可以有如下幾點: 1、需求所涉及的介面的背景描述 2、介面跟頁面功能互動的關聯關係 3、介面邏輯的流程圖 4、介面文件定義 5、介面所涉及的快取,以及快取對應的key值,失效時間定義 6、介面所涉及的SQL,以及資料庫表字段定義

修改使用HtmlTestRunner 生成測試報告的路徑

希望 搜索 9.png 測試用例 問題: res 默認 htm 測試 1.問題: 在使用python+appium+unittest 做app 自動化測試項目時,用到HtmlTestRunner 工具生成的測試報告默認存放在測試用例所在的目錄下, 希望能改成測試報告的目錄與

python 多個*.py檔案生成一個報告--修改HtmlTestRunner

使用python + unittest生成測試報告,目前網上最普遍的是兩個開源方法: HTMLTestRunner HtmlTestRunner 其中第2個是基於第1個實現的;第1個已經不維護了,如果應用到py3,需要自己做一些修改,此外,樣式並不好看( ╯□╰ )。

Mybatis generator生成Service,Controller,新增批量新增資料介面(基於mybatis-generator-1.3.5原始碼修改)

    好久記錄筆記,這段時間做政府的專案,資料錄入系統基本都是通過excel匯入,且資料量大,許多也是單表的錄入,這就有很多可以通用的程式碼,如controller,service層的那一套都是可以程式碼生成,添加了一個數據庫批量新增介面(目前只支援oracle), 程式碼是基於mybatis-gener

Dubbo原始碼分析RPC協議實現-RPC過程與核心介面設計

RPC的基本過程 提供者Provider:提供服務的介面定義和介面的具體實現,然後通過URL的方式告訴消費者,某個URL對應某個service實現,一般是將服務的資訊註冊到一個註冊中心,如zookeeper或者Redis等; 消費者Consumer:獲取提供者的介面定義

Mybatis 原始碼分析獲取 Mapper 介面物件

我們知道使用 mybatis 作為 ORM 框架時,想要使用面向介面的方式操作資料庫,即使用 mapper 檔案形式,那麼就需要獲取 Mapper 介面物件,從而才能對資料庫進行操作。那麼問題來了,在 java 中是不可能對 interface 進行 new 的

spring原始碼分析Aware介面讓你的bean對容器直接操作

相信大家都知道很多其他框架,比如mybatis,shiro等等,spring框架本身有些類會實現ApplicationContextAware,BeanFactoryAware或者等等其他XXXAware,這是用來幹嘛呢? spring容器來管理bean。如果說bean需要知道容器的

spring原始碼解讀BeanFactory介面

不知道為什麼看著Spring的原始碼,感觸最深的是Spring對概念的抽象,所以我就先學介面了,BeanFactory是Spring IOC實現的基礎,這邊定義了一系列的介面,我們通過這些介面的學習,可以大致瞭解BeanFactory體系各介面如何分工合作。 為學習具體實現

Spring原始碼學習IOC(7)淺析aware相關介面

spring中 有一大堆Aware結尾介面,  例如BeanFactoryAware,  ApplicationContextAware, ServletContextAware等  在程式中 我們自定義的bean實現了 Aware相關介面  spring 通過回撥 

OpenLayers學習二點標記的新增刪除和修改(以類為介面

OpenLayers官網提供的例子:點標記的新增我每一個功能都用了一個單獨的JS檔案,並且是以類為介面的方式。OpenLayer新增點標記的順序是:Map —— Layer —— Source —— Feature (Style) —— Geometry上面從大到小,Geom

Python+Selenium模組資料化之4多賬號登入並驗證+增加測試報告介面

日誌介面:log_module.pyimport time import os class Loginfo(object): def __init__(self, mode='w'): #開啟檔案 path = os.path.dirname(os.

Mybaits 原始碼解析 (五)----- 面試原始碼系列Mapper介面底層原理(為什麼Mapper不用寫實現類就能訪問到資料庫?)

剛開始使用Mybaits的同學有沒有這樣的疑惑,為什麼我們沒有編寫Mapper的實現類,卻能呼叫Mapper的方法呢?本篇文章我帶大家一起來解決這個疑問 上一篇文章我們獲取到了DefaultSqlSession,接著我們來看第一篇文章測試用例後面的程式碼 EmployeeMapper employee

Mybaits 原始碼解析 (十一)----- 設計模式精妙使用靜態代理和動態代理結合使用@MapperScan將Mapper介面生成代理注入到Spring

上一篇文章我們講了SqlSessionFactoryBean,通過這個FactoryBean建立SqlSessionFactory並註冊進Spring容器,這篇文章我們就講剩下的部分,通過MapperScannerConfigurer將Mapper介面生成代理注入到Spring 掃描Mapper介面 我們上一

【一起學原始碼-微服務】Nexflix Eureka 原始碼EurekaServer啟動之配置檔案載入以及面向介面的配置項讀取

前言 上篇文章已經介紹了 為何要讀netflix eureka原始碼了,這裡就不再概述,下面開始正式原始碼解讀的內容。 如若轉載 請標明來源:一枝花算不算浪漫 程式碼總覽 還記得上文中,我們通過web.xml找到了eureka server入口的類EurekaBootStrap,這裡我們就先來簡單地看下: /

vnpy原始碼閱讀學習(3)學習vnpy的介面的實現

學習vnpy的介面的實現 通過簡單的學習了PyQt5的一些程式碼以後,我們基本上可以理解PyQt的一些用法,下面讓我們來先研究下vnpy的UI部分的程式碼。 首先回到上一節看到的run.py(/vnpy/example/trade/run.py)的關於UI部分的程式碼。 生成QApplication部分 qa