測試驅動開發 TDD

来源:https://www.cnblogs.com/szlblog/archive/2018/05/08/9011338.html
-Advertisement-
Play Games

一、詳解TDD 1.1、TDD概念 :Test Drived Develop 測試驅動開發是敏捷開發中的一項核心實踐和技術,也是一種方法論。TDD的原理是在開發功能代碼之前,編寫單元測試用例代碼,測試代碼決定先編寫什麼產品代碼。TDD雖是敏捷方法的核心實踐,但不只是適用於XP,同樣可以適用於其他開發 ...


一、詳解TDD

1.1TDD概念 :Test Drived Develop

測試驅動開發是敏捷開發中的一項核心實踐和技術也是一種方法論TDD的原理是在開發功能代碼之前,編寫單元測試用例代碼,測試代碼決定先編寫什麼產品代碼。TDD雖是敏捷方法的核心實踐,但不只是適用於XP,同樣可以適用於其他開發方法和過程

 TDD的基本思路就是通過測試來推動整個開發的進行,但測試驅動開發並不只是單純的測試工作,而是把需求分析,設計,質量控制量化的過成。

     TDD的重要目的不是僅僅測試軟體,測試工作保證代碼質量只是其中一部分,而且是開發過程中幫助客戶和程式員去除模棱兩可的需求TDD首先考慮使用需求(對象、介面、功能、過程、等)

1.2 測試驅動開發的優缺點

  TDD:測試驅動開發的優點:

再任意一個開發節點都可以拿出一個可以使用,含少量的BUG 並具有一定的功能能夠發佈的產品。

TDD:測試驅動開發的缺點:

  缺點:增加了代碼工作量。測試代碼幾乎是系統代碼的兩倍或更多,但是同時節省了程式調試的時間以及挑錯的時間。

      TDD=TFD+Refactoring      第一次測試開發加上重構

      TDD:Test First Development  首次測試開發

 

1.3TDD原則

1.獨立測試:不同代碼的測試應該相互獨立,一個類對應一個測試類(對於C代碼或C++全局函數,則一個文件對應一個測試文件),一個函數對應一個測試函數用例也應該各自獨立,每個用例不能使用其他用例的結果數據,結果也不能依賴於例執行順序。一個角色開發過程中包含多種工作,(編寫測試代碼、編寫產品代碼、代碼重構 等。做不同工作的時候,應專註於當前要做的事情,不考慮其他,比如測試的時候就做測試)

     

2.測試列表:代碼的功能點很多,不可能是所有的需求都是很明確的,而是陸陸續續的出現新的需求,在進行的任何階段時想添加功能時,應把相關的功能點 添加到測試列表中,在繼續改階段的工作,以避免疏漏。

 

3.測試驅動:及利用測試來驅動開發,是TDD的核心。要實現某個功能,要編寫某個類或某個函數,應該先編寫測試代碼,明確這個類、這個函數如何使用,如何測試,然後對其進行設計、編碼。

 

4.先寫斷言:編寫測試代碼時,應該首先編寫判斷代碼功能的斷言語句,然後編寫必要的輔助語句。

 

 

能應該比較單純,每個類、每個函數、只做自己的事情,不摻雜然和功能。

 

6.及時重構:對結構不合理,重覆等不好的代碼,在測試通過後,應及時進行重構。

 

7.小步前進:軟體開發是複雜性非常高的工作,小步前進是降低複雜性的好辦法。

 

1.4TDD總結

測試驅動開發:既可以測試框架的性能、也可以測出業務的合理性,也可以測試出代碼的問題、雖然開發時間會延後、但是可以提高客戶的滿意度,上線後系統比較穩定。

 

 

一個軟體的產出,需要具有詳細的設計:從開始的競標,到立項到設計,開發,交付任何一個環節都不可缺少。

       舉例描述:

       某公司競標後拿下了這樣一個工程,在兩座山之間建造一座大橋,產品經理把業務具體分析過後交給了公司的設計師(架構師)設計師根據客戶對產品的質量、美觀、使用性、進行架構設計:產出物如下圖:

            架構師設計出有幾個橋墩沉重力度,橋面寬度高度,形狀。。。等。

 

這樣整體架構就出現了,高級工程師根據架構師的架構進行小的設計比如說用什麼樣的材料怎麼做橋於橋之間的關聯等,(在開發來說就是用什麼介面,介面怎麼制定,怎麼保證安全性)剩下的就交給中級工程師了,等到開發完後進行測試。

 

      上面簡單的描述是一般產品的產出流程,但是一般的流程去做這樣一個特殊的工程顯然不夠的,比如說怎麼知道這個框架是否安全,現在的說服力一般都體現在數字和具體的有說服力的案例上面,但是沒有案例的話,就需要我們隊框架進行測試了,在這個沒有真正做施工之前,框架設計出之後進行的測試,大家就可以理解成TDD測試了,這時候的TDD很顯然偏向於架構的設計。再往小點的方面來說比如測試介面的時候,其實也是設計介面,TDD偏向於設計,而不是很多人認為的測試。

 

利用TDD 測試驅動 舉一個例子:

      業務場景:用戶下訂單,訂單類型“普通訂單、批量訂單、個人訂單” 判斷用戶是是否具有下此類訂單的許可權。

 

如果所根據這個業務讓咱們設計一下咱們肯定都沒有問題:

資料庫創建腳本

 

CREATE TABLE  OederTable --訂單表
(
 ID INT PRIMARY KEY IDENTITY (1,1), -- ID
 OredrNo varchar(100),  --訂單編號
 OrderTypeNo varchar(100), --訂單類型編號
 CreateBy varchar(200)--創建人
)

CREATE TABLE  UserRights --用戶許可權表
(
 OrderTypeNo varchar(100),--訂單類型編號
 UserID INT  --用戶ID
)


CREATE TABLE  UserTable --用戶表
(
 ID INT PRIMARY KEY IDENTITY (1,1), --ID
 UserName varchar(100), --用戶名
 UserPwd varchar(200) --用戶密碼
)

CREATE TABLE  TypeTable --訂單類型表
(
 OrderTypeNo varchar(100),--訂單類型編號
 OrderTypeName varchar(100)--訂單類型名稱
)
View Code

 填充數據

實現測試業務流程代碼具體如下:

代碼中映射了四個實體類,一個訂單操作類。

訂單操作類具體代碼如下(代碼中並沒有具體實現主要以意會為主(~o~))

 

 //測試代碼
        public void TestMethod1()
        {
            OrderOperation OrderOperation = new OrderOperation();
            OederTable Oeder = new OederTable();
            Oeder.OredrNo = "100";
            Oeder.OrderTypeNo = "1"; //普通訂單許可權
            Oeder.CreateBy = "admin";
            //1.驗證用戶是否存在
            //2.驗證用戶是否是否具有下訂單的許可權
            //3.保存入庫
            /************假設用戶表為空時咱們已經通過用戶名密碼查詢過並且存在該用戶*************/
            UserTable user = new UserTable();
            if (user != null)
            {
    //通過UserID查詢許可權是否有下普通訂單的許可權    Oeder.OrderTypeNo = "1"; 普通訂單許可權
                UserRights Rights = new UserRights();
                if (Rights != null)
                {
                    //添加入庫
                    OrderOperation.add(Oeder);
                }
            }
        }
View Code

其實不管用任何辦法,只要結果符合描述就行,HARD Code 也是一個很好的方法,我們現在關註點應該放在業務流程的正確性,數據從哪裡來不重要。

 

如果添加成功最好有一個返回值能體業務的正確性,比如添加成功後返回“OK”

以上描述有部分來自於互聯網:

 


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

-Advertisement-
Play Games
更多相關文章
  • 在react項目開發中,input標簽使用onChange方法獲取輸入值改變state: 但是,在IE9下發現 e.target.value 取值一直為undefined。在IE中,e.target 指的是window,查閱React文檔發現: 解決方法: ...
  • 頁面佈局,或者是在頁面上做些小效果的時候經常會用到 display,position和float 屬性,如果對它們不是很瞭解的話,很容易出現一些莫名其妙的效果,痛定思痛讀了《CSS Mastery》後總結一下。 讓我們從基礎的CSS知識談起,相信很多初學者和小弟一樣不明白CSS原理,一味追求效果,結 ...
  • 關鍵詞出現在網站哪些地方符合SEO?進行網站的SEO時,關鍵詞需要出現在整個網站的適當地方。下麵列出幾個重要的關鍵詞擺放的地方。以下列出的10個地方希望能夠幫助到大家。 1、網站Title部分。 2、網站Meta Keywords部分。 3、網站Meta Description部分。 4、 關鍵詞出 ...
  • 一個前端在調試本地頁面時,總會有些稀奇古怪的需求,比如產品立刻要看你的頁面效果,而此時有沒有上線環境折騰給他看,那此時通過內網穿透的方式,實時把你的項目生成一個線上鏈接丟給他,讓他去找那一像素的bug! ...
  • 由於最近在vue-cli生成的webpack模板項目的基礎上寫一個小東西,開發過程中需要改動到build和config裡面一些相關的配置,所以剛好趁此機會將所有配置文件看一遍,理一理思路,也便於以後修改配置的時候不會“太折騰”。 一、文件結構 本文主要分析開發(dev)和構建(build)兩個過程涉 ...
  • 1. 下載並安裝 node.js 參照 Less 的用法 2. 新建一個項目 3. 控制台進入該項目目錄,初始化 根目錄中自動生成了package.json 4、全局安裝webpack和webpack-cli 5、在項目中安裝webpack和webpack-cli 6. 安裝babel 7. 編輯 ...
  • 模塊化原則倡導利用集中和分解等手法創建高內聚、低耦合的抽象。 為了理解模塊化的含義及其很重要的原因,來看看一本書的極端情況。假設一本書像講一個長故事一樣闡述其中的內容,中間沒有任何停頓,也沒有章節。試問面對這樣的圖書,讀者將作何反應呢?我估計心中一定有千萬隻草泥馬在崩騰吧。如果這本書根據內容分為不同 ...
  • 一.抽象類 在某些情況下,父類知道其子類應該包含哪些方法,但是無法確定這些子類如何實現這些方法。這種有方法簽名但是沒有具體實現細節的方法就是抽象方法。有抽象方法的類只能被定義成抽象類,抽象方法和抽象類必須使用abstract修飾。抽象類里可以沒有抽象方法。 1.1 抽象類和抽象方法 抽象類和抽象方法 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...