軟體測試大牛都是這樣寫測試用例的,你get到了嘛?

来源:https://www.cnblogs.com/cemaxueyuan/archive/2020/06/02/13034267.html
-Advertisement-
Play Games

1. 用於語句覆蓋的基路徑法 基路徑法保證設計出的測試用例,使程式的每一個可執行語句至少執行一次,即實現語句覆蓋。基路徑法是理論與應用脫節的典型,基本上沒有應用價值,讀者稍作瞭解即可,不必理解和掌握。 基路徑法步驟如下: 1)畫出程式的控制流圖 控制流圖是描述程式控制流的一種圖示方法,主要由結點和邊 ...


1. 用於語句覆蓋的基路徑法

基路徑法保證設計出的測試用例,使程式的每一個可執行語句至少執行一次,即實現語句覆蓋。基路徑法是理論與應用脫節的典型,基本上沒有應用價值,讀者稍作瞭解即可,不必理解和掌握。

基路徑法步驟如下:

1)畫出程式的控制流圖

控制流圖是描述程式控制流的一種圖示方法,主要由結點和邊構成,邊代表控制流的方向,節點代表控制流的匯聚處,邊和結點圈定的空間叫做區域,下麵是控制流圖的基本元素:

 

void Sort(int iRecordNum, int iType)
{
int x = 0;
int y = 0;
 
while(iRecordNum-- > 0)
{
if(0 == iType)
{
x = y+2;
break;
}
elseif(1 == iType)
{
x = y+10;
}
else
{
x = y+ 20;
}
}
}

  

 

2)計算程式環路複雜度

環路複雜度V(G)可用以下3種方法求得:

(1) 環路複雜度等於控制流圖中的區域數;

上圖中,有4個區域,V(G) = 4。

(2) 設E為控制流圖的邊數,N為結點數,則環路複雜度為E-N+2;

上圖中,V(G) = 10(邊) – 8(結點) + 2 = 4。

(3) 設P為控制流圖中的判定結點數,環路複雜度為P+1。

上圖中:V(G) = 3(判定結點) + 1 = 4。

環路複雜度是獨立路徑數的上界,也就是需要的測試用例數的上界。
再這裡向大家推薦一個資料分享群:175317069

3)導出基本路徑集

基本路徑數等於V(G)。根據上面的計算方法,可得出需要的基本路徑數為4。路徑就是從程式的入口到出口的可能路線,基本路徑要求每條路徑至少包含一條新的邊,直到所有的邊都被包含。需要提醒的是:基路徑法和路徑覆蓋是兩回事,用於設計用例的基路徑數一般小於全部路徑數,即基本路徑集不是惟一的。基路徑法完成的是語句覆蓋,而不是路徑覆蓋。下麵選擇四條基本路徑:

路徑1:1-11

路徑2:1-2-3-4-5-1-11

路徑3:1-2-3-6-8-9-10-1-11

路徑4:1-2-3-6-7-9-10-1-11

設計用例
根據上面的路徑,可以設計出以下用例:

路徑1:1-11

用例1:iRecordNum = 0

路徑2:1-2-3-4-5-1-11

用例2:iRecordNum=1, iType = 0

路徑3:1-2-3-6-8-9-10-1-11

用例3:iRecordNum=1, iType = 1

路徑4:1-2-3-6-7-9-10-1-11

用例4:iRecordNum=1, iType = 2

從上述步驟可以看出,基路徑法工作量巨大,如果用於五十行左右的函數,將耗費大量的時間,而五十行代碼的函數實在是太普通了。這種成本巨高的方法,其測試效果如何呢?測試效果完全與成本不匹配,首先,基路徑法完成的只是代碼覆蓋,這是最低級別的覆蓋,其次,整個設計過程都是依據已經存在的代碼來進行的,沒有考慮程式的設計功能,是典型的“跟著代碼走”,不足是顯而易見的。綜上所述,基路徑法沒有實際應用價值。

2. 用於MC/DC的真值表法

設計用於MC/DC的用例,可以先將條件值的所有可能組合列出表格,然後從中選擇用例,稱為真值表法。例如判定A || (B && C),條件組合如下表:

 

為了使A獨立影響判定結果,選擇B和C相同,判定結果相反,且A相反的組合:組合2和6;

為了使B獨立影響判定結果,選擇A和C相同,判定結果相反,且B相反的組合:組合5和7;

為了使C獨立影響判定結果,選擇A和B相同,判定結果相反,且C相反的組合:組合5和6。

因此,組合2、5、6、7符合MC/DC要求。符合MC/DC要求的用例集不是惟一的。

為了提高效率,可以使用工具來生成真值表和找出符合要求的組合,有些商業工具具有這種功能。自行開發難度也不大,下麵提出開發MC/DC用例設計小工具的思路,有興趣的讀者可以嘗試一下:

1)用一個簡單的詞法和語法分析器解析判定表達式,計算條件數量;

2)生成真值表;

3)用一個邏輯表達式計算器,針對每個條件C,掃描真值表,找出符合以下要求的組合:除條件C外,其他條件取值相同;將條件C的真值和假值分別代入判定表達式,判定的計算結果相反。

4)針對找出的組合,設計兩個用例,條件C分別取真和假。

需要註意的是,判定中可能存在完全相同的條件,例如:

(A==0 || B == 1) && C == 2 || (A==0 && D == 3)
針對A==0設計MC/DC用例時,前一個A==0取反,後一個A==0也會跟著取反,如果後一個A==0視為其他條件,則不能實現MC/DC覆蓋,因此,計算判定值時,兩個A==0應視為同一個條件。

3 邊界值法

邊界值法假定錯誤最有可能出現在區間之間的邊界,一般對邊界值本身,及邊界值的兩邊都需設計測試用例。

如下函數:

//參數age表示年齡 
 
int func(int age) 
{ 
int ret = 0; 
//… do something 
return ret; 
}

  

參數age表示一個人的年齡,假設有效的取值範圍是0-200,那麼,用邊界值法可以得出以下用例(省略輸出):

用例1:age = -1;

用例2:age = 0;

用例3:age = 1;

用例4:age = 199;

用例5:age = 200;

用例6:age = 201;

通常,程式對輸入還會分段處理,例如,年齡在10以下,為兒童,需要特別照顧;年齡在60歲以上,為退休老人,不能安排工作,那麼,10和60是內部邊界,也要設計測試用例:

用例7:age =9;

用例8:age = 10;

用例9:age = 11;

用例10:age = 59;

用例11:age = 60;

用例12:age = 61;

邊界值法需要瞭解數據所代表的實際意義,此外對於枚舉類型等非標量數據不適用。邊界值法對於複雜的軟體項目來說,適用範圍有限。

4 等價類法

先從代碼編寫的思路說起。程式員編寫一個函數的代碼,會如何做呢?

首先,瞭解代碼功能。程式的功能是什麼?無非就是:有哪些輸入?執行什麼操作或計算?產生什麼輸出?

然後,將功能細化,形成一個或多個功能點。一個功能點就是一類輸入及其處理。什麼叫“一類”輸入?程式可能有無數輸入,但代碼並不需要用無數個判定來對每個輸入分別做處理,只需將輸入分類,需要做相同處理的輸入歸於一類,這就是“等價類”。從編程角度來說,“等價類”是指計算或操作過程的“等價”,一個等價類就是處理過程完全相同的輸入的集合。程式中通常用判定來識別分類,一個判定就是一次分類,嵌套的判定則會造成分類數量的翻番。

所以,函數代碼編寫的核心思維就是等價類劃分和處理。一個函數要完全正確,關鍵是等價類的劃分要正確完整,且每個等價類的處理正確。

舉個例子,現在要編寫一個函數,將字元串左邊的空格刪除。函數原形如下:

char* strtrml(char *str); 

  

功能:

將str左邊空格刪除,並返回str本身。

功能點:

1. 左邊有空格:刪除;(正常輸入)

2. 左邊無空格:不作處理;(正常輸入)

3. 全部是空格:全部刪除;(正常輸入)

4. 空串:不作處理;(邊界輸入)

5. 空指針:直接返回。(非法輸入)

不一定需要針對每個功能點分別寫代碼,因為程式中的if、for、while等語句本身具有“如果不符合條件就跳過”的含義,所以很多功能點是可以共用代碼的,例如,前4個功能點只需要相同的代碼,不過,編程時對功能點的考慮還是要全面。

既然函數沒有錯誤的關鍵是等價類劃分正確完整且處理正確,那麼測試時,只要把輸入的等價類都列出來,並設定正確的預期輸出,進行測試就行了。

這就是通常說的“等價類”法,從測試角度來說的“等價”,是指測試效果上的等價,即同類中一個數據測試通過,可以肯定其他數據也會測試通過。

用例設計的首要工作是設定輸入。輸入有哪些呢?要從正常輸入、邊界輸入、非法輸入三方面考慮,每方面進一步劃分形成等價類,即要考慮:有哪些正常輸入?有哪些邊界輸入?有哪些非法輸入?

多個輸入時,例如有多個參數,首先把各個參數的等價類列出來,然後要考慮參數之間是否存在特殊的組合關係。例如下麵的函數:

//計算某年某月某日是星期幾,參數分別表示年月日 
 
int Date(int year, int month, int day); 

  

用例如下表(假設year的有效範圍是1-9999):

 

 

用例的輸出是比較容易被輕視的工作,但是,沒有充分且正確的預期輸出,用例基本上沒有意義,就像醫生要求病人做一大堆檢查,卻不看檢查結果一樣。預期輸出要根據程式的設計功能確定正確的值。一個用例的預期輸出可能有多個。

等價類法是與程式的基本特性“對數據分類處理”相匹配的方法。對於一個函數來說,如果對數據的分類正確且完整,每一個分類處理正確,那麼,程式就沒有問題。同樣,測試時,只要依據設計功能,找出所有等價類,那麼,用例就是完整的。所以,用例的完整性,本質上是指等價類是否劃分正確且完整,每一類的正確輸出是否均依據設計功能正確設定。

使用了等價類法後,是否需要使用其他方法呢?

等價類法從“有哪些正常輸入?有哪些邊界輸入?有哪些非法輸入?”三個方面來考慮等價類,因此,邊界值法是等價類法的一部分。

常見的用例設計方法中還有正交法和錯誤推測法。正交法考慮數據的組合,實際上,如果程式對輸入數據的組合需要判斷處理,也是一種等價類劃分,但正交法會產生大量的多餘組合,且可能缺少必要的組合,因此不推薦採用正交法,應該根據數據的實際意義自行組合。單獨從錯誤推測角度去設計用例未免太不可靠,但錯誤推測法可以作為檢查等價類是否完整的一種思路,即用等價類法設計用例後,可以考慮哪些輸入比較容易產生錯誤,以檢查是否遺漏,這隻是一種檢查思路,也包含在等價類法之中。總之,用例設計只需使用等價類法,但可以從多種角度檢查等價類的完整性。

當真正開始學習的時候頻繁踩坑,最終浪費大量時間,所以有一套實用的視頻資料用來跟著學習是非常有必要的。

這套視頻資料詳細講解了(自動化編程,mysql調優,自動化框架rf使用)。

那麼,這套視頻我們應該怎麼獲取呢?

對以上測試資料,測試技術 感興趣的朋友,歡迎加QQ群:718897738,一起學習,相互討論。

群內已經有小伙伴將知識體系整理好(筆記,學習視頻,面試題),歡迎加群免費取。




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 老孟導讀:歷時1年的時間,整理完成了330+組件的詳細用法,不僅包含UI組件,還包含了功能性的組件。 雖然整理了 330+的組件基本用法,但並不是讓你每一個都學習一遍,任何技術基本都是掌握 20%就可以解決 80%的問題,因此只需學會基礎組件就可以上手項目了,至於其他的控制項只需大概瀏覽一下,做項目的 ...
  • 19. 文件讀寫 19.1 文件操作 數據持久化,是將程式中的對象以數據的方式保存到磁碟上,在程式下次運行時,可以將數據從磁碟上恢復到記憶體中。數據持久化的方式有很多,而最為常見的方式是將數據以文件的形式保存。在Python中,可以通過內置函數的方法進行文件的讀、寫、刪除等操作。 19.1.1 文件的 ...
  • 18.目錄與文件 18.1 os和shutil 日常使用過程中,難免需要使用跟文件系統相關的標準庫。在使用Python文件系統中,常用的庫為os和shutil標準庫,方法如下所示: import os import shutil 18.1.1 遍歷文件夾 os.getcwd():獲取當前工作目錄,返 ...
  • 1 import tkinter 2 import subprocess 3 import os 4 import time 5 import re 6 import sys 7 from tkinter import Label, Button, StringVar 8 from tkinter. ...
  • 在c/c++中,為瞭解決一些頻繁調用的小函數大量消耗棧空間(棧記憶體)的問題,特別的引入了inline修飾符,表示為內聯函數。 棧空間就是指放置程式的局部數據(也就是函數內數據)的記憶體空間。 在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足而導致程式出錯的問題,如,函數的死迴圈遞歸調用 ...
  • 類規範:包括類聲明以及類方法定義 類聲明提供類的藍圖 方法定義提供細節 常見不通用的約定:類名首字母大寫 類介面: 介面由編寫類的人提供的方法組成。介面讓程式員能夠編寫與類對象交互的代碼,從而讓程式能夠使用類對象。 要使用某個類,必須瞭解其公共介面;要編寫類,必須創建其公共介面。 通常,C++程式員 ...
  • @(目錄) 我的經歷 關註我的朋友都知道,關註兩個字劃重點,要考! 我最近一直在寫Spring的文章,而且僅僅是Spring FrameWork的文章 ,從最開始的官網入門到現在源碼的深度分析。主要就是三個系列 官網入門系列,Spring官網讀書筆記,這一系列的文章是入門Spring的不二之選,也是 ...
  • 最近在學習數據結構,特此記錄一下,方便以後查閱. 1 //定義一個類來管理我們的英雄 也就是鏈表 2 class SingleLinkedList{ 3 //先初始化一個頭節點,頭節點不能動,用於尋找鏈表的頭 4 private HeroNode head = new HeroNode(0,""," ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...