1. 程式人生 > >PHPUnit單元測試系列二 -- 如何開展單測

PHPUnit單元測試系列二 -- 如何開展單測

雖然大家都說TDD,都有美好的幻想說,我們先寫測試用例,然後再寫實際程式碼。不過,現實中,我目前還沒接觸過這樣的團隊(真希望以後,能夠到這種團隊,很認真的TDD開發,有這樣團隊的記得聯絡我哈~留言就可以了~),大部分的人都是已經剛開發好了,然後,才加入單元測試的。

而且,大部分的情況都是,老大要求做單元測試,或者,對應的QA做單元測試。我待過3個團隊,都是先開發程式碼,然後老大要求做單元測試,所以才這麼弄的。我不喜歡,這種需要其他人來催促,才做單元測試的團隊。

針對這種先有程式碼,後要弄單元測試的,困難程度和RD的素質成反比。RD素質越高,程式碼質量越好,單測越好寫。按照我的經歷,這個過程中,有一些困難:1.有一些依賴特別難解除;2.資料庫;3.如何mock一些場景,比如,Yii框架中的元件,要麼mock很困難,要麼mock這個method,就會影響其他的method。

廢話不多說,直接入正題,如何在已有程式碼的情況下,開展單測。

一、確定框架

不適用框架的場景:

PHP這麼被網際網路公司廣泛使用的原因,在於簡單還有其框架也很簡單。雖然,我們可以不使用任何框架,就能夠開發。這種情況也有,單測也很好寫,就是直接載入,然後,呼叫方法,最後$this->assertEquals();判斷就完事了。而且,這種程式碼中,要測試的物件也很明確。

對於使用框架的場景:

有了框架之後,method就多了,茫茫多啊。什麼Controller、model、components的,一堆一堆的。有的人,雄心壯志,要測試所有的method。基本是不大可能對所有的method都做測試的,除非你的團隊其他事情都不做,就做單元測試。

我們通過合理選擇"高層"的測試物件,然後,通過行覆蓋來搞定其他的method。基本上,都是controller呼叫model或者components的東西,所以大部分情況下,我們都是測試Controller或者是action之類的。對於其他的,我們就要分開對待了,如果是很重要的method,我們可以單獨寫測試用例,不然,我們都不需要考慮這個。

確定要測試的物件之後,我們就可以開始了。就以Yii框架為例,這裡有Yii框架的demo,不過,它的case不是很好,我準備改進改進。這裡是Yii框架的例子,不熟悉的先看看。Yii框架給了四個demo,分別是hello world, Hangman Game

PhonebookYii Blog. 然後,我會寫根據這個來寫測試用例,任何的程式碼,我都會在我本地跑通,歡迎大家下載查閱。

先從Hello world入手,Yii框架hello world的程式碼,只有簡單的一個Index.php和SiteController.php。

1、載入框架

載入框架的程式碼和index.php的程式碼差不多一樣,只不過,我們把run();給去掉了,因為我們呼叫controller的方式是手工的。程式碼如下:

<?php
// include Yii bootstrap file
require_once(dirname(__FILE__).'/../../framework/yii.php');

// create a Web application instance and run
Yii::createWebApplication();

function runController($strController, $isAjax = true){
    if($isAjax){
        $_SERVER['HTTP_X_REQUESTED_WITH']='XMLHttpRequest';
    }
    $_SERVER['REQUEST_URI'] = $strController;
    $route = Yii::app()->getUrlManager()->parseUrl(new CHttpRequest());

    list($controller, $action) = Yii::app()->createController($route);
    $controller->init();
    return $controller->run($action);
}
?>

這裡要注意,我們多加了個runController的函式,這個函式就是用於我們手工的去呼叫controller。

這樣,我們就完成我們的bootstrap檔案了。因為這個例子很簡單,我們就可以開始寫CASE了。

2.編寫Hello的測試用例

我們要測試的內容就是,打印出來的語句是否為Hello World.

<?php
require_once(dirname(__FILE__).'/../index-test.php');

class siteControllerTest extends PHPUnit_Framework_TestCase{
    public function setup(){
    }

    public function testHelloworld(){
        ob_start();
        $res = runController('site/index');
        $echoRes = ob_get_contents();
        $this->assertEquals($echoRes, 'Hello World');

    }
}
?>

在這個case裡,我們首先載入我們第一步寫好的啟動檔案,然後使用PHPUnit框架,繼承其TestCase的基礎類。然後,在實際的測試程式碼testHelloworld中,我們使用ob_start和ob_get_contents來獲取echo的結果,最後進行比對。這就是最簡單的Hello world單元測試。

下面附上我自己執行的結果:



接下來,我們就要弄剩下的DEMOS了。

因為平時要上班,只能空閒時間寫,如果大家有問題,歡迎提出。程式碼等我寫完了,就一起上傳上來。

相關推薦

PHPUnit單元測試系列 -- 如何開展

雖然大家都說TDD,都有美好的幻想說,我們先寫測試用例,然後再寫實際程式碼。不過,現實中,我目前還沒接觸過這樣的團隊(真希望以後,能夠到這種團隊,很認真的TDD開發,有這樣團隊的記得聯絡我哈~留言就可以了~),大部分的人都是已經剛開發好了,然後,才加入單元測試的。 而且,大

單元測試

features 連接 相關 ext add 才會 ofo itself 源碼 前言:junit 介紹。轉載請註明出處:https://www.cnblogs.com/yuxiaole/p/9405519.html 二、 java單測工具 junit4介紹 Java用的

phpunit 單元測試之程式碼覆蓋率

最近團隊在不斷完善專案中的單元測試用例,會用到程式碼覆蓋率分析,本來以為 homestead 應該預設安裝了 xdebug ,所以使用 phpunit --coverage-html ./tests/codeCoverage 來生成 html 報告,但是執行後提示如下錯誤 Error: No

JUnit自動化單元測試):簡單測試例項講解

自上一篇部落格起,我們現在有了測試類TestCalcuate,預設是這樣的 package junit.demo; import static org.junit.Assert.*; import org.junit.Test; public class Te

SpringBoot單元測試)MockMVC

介紹 MockMvc,從字面來理解,很好理解,主要是用來模擬MVC。簡單來說,就是模擬可以從客戶端請求後端的Controller類。 樣例: 1. 非自動注入式 TestApplicationTests類已經有@RunWith(SpringRunner.class)和@S

spring-test單元測試)-進行struts action的請求單元測試

單元測試雖不強求,但你一旦養成習慣,你會愛上它。另外我們保證程式碼質量的兩個很重要的手段,一個是頭(單元測試)一個是尾(codereview)。那麼我們最常用的單元測試就是通過junit來進行,spring-test框架很好的集成了junit來進行這項工作,比如測試dao,

單元測試系列一-為什麼要寫單元測試,何時寫,寫多細

一、前言 半年前在公司團隊內推動單元測試的落地,略有一些心得,記錄在此。如有不同觀點或建議,請在評論區留言,一起探討。 定義:單元測試是用來對一個模組、一個函式或者一個類來進行正確性檢驗的測試工作。 單元測試從長期來看,可以提高程式碼質量,減少維

軟體測試系列自動化測試

 1. 什麼是自動化測試?你理解的自動化測試的表現形式是什麼?  自動化測試的一般定義:各種測試活動的管理與實施,包括測試指令碼的開發與執行,以便使用一種自動化測試工具來驗證測試需求。 注:不用將自動化測試的概念理解的過於狹窄,只i關係由工具或程式設計產生的測試指令碼。實際

如何愉快的在PhpStorm中進行PHPUnit單元測試和Xdebug斷點除錯?

前言 如果你想做個介面測試,但並不想公開內部介面 如果你只是想對自己封裝的某塊程式碼做個小測試 如果你想要編寫程式碼邊除錯,又不想操作 Postman 或前端的功能來呼叫 API 本文暫時僅介紹在

單元測試系列三-基於Springboot+Junit+Mockito做單元測試

前言 前面的兩篇文章討論過《為什麼要寫單元測試,何時寫,寫多細》和《單元測試規範》,這篇文章介紹如何使用Springboot+Junit+Mockito做單元測試,案例選取撮合交易的一個類來做單元測試。 單元測試前先理解需求 要寫出好的單測,必須先理解

Visual Studio 單元測試---順序單元測試

本文會自動略去上篇中提到過的相關概念、方法。本文的例子可以使用下面的連結下載: 上一篇我們做的測試都是一個一個進行的,當然我們也可以一次性選擇多個測試方法進行,但是測試執行的順序以Test List Editor視窗中的預設列表順序為準。在實際場景中,我們需要進行有順

單元測試系列之4:使用Unitils測試DAO層

Spring 的測試框架為我們提供一個強大的測試環境,解決日常單元測試中遇到的大部分測試難題:如執行多個測試用例和測試方法時,Spring上下文只需建立一次;資料庫現場不受破壞;方便手工指定Spring配置檔案、手工設定Spring容器是否需要重新載入等。但也存在不足的地方,

python六十六課——單元測試

down teardown 構造 stc def style return urn etag ‘‘‘ 封裝Person類 ‘‘‘ class Person: def __init__(self,name,age): self.name=

學習筆記:首次進行JUnit+Ant構建自動的單元測試

mda 點擊 實踐 簡單的 build 項目文件 strong 答案 das 關鍵字:JUnit,Ant,單元測試 終於把JUnit+Ant構建單元測試的大概了解了,其實我實踐的過程是對了,只是指導博客(看到這裏不懂請看我上一篇博客)本身的錯誤“成功&rdqu

為什麽我們要做單元測試?()

copy 包括 習慣 代碼質量 方式 run 內存數據庫 帶來 mes 引子 當我第一篇博客原題叫做<為什麽.NET開發者都不寫單元測試>,我的本意是想跟.NET技術圈的朋友們一起交流,為什麽過去在.NET開發中很少用到單元測試,之後,在公眾號文章和博客園的

.NET Core之單元測試):使用記憶體資料庫處理單元測試中的資料庫依賴

目錄 定義一個待測試API 測試用例 為減少篇幅,隱藏了SampleEntity和SqliteDbContext 定義一個待測試API 如下,我們定義了一個名為Sample的API,其中有一個外部依賴項Sqli

單元測試編寫技巧與原則

最近因工作需要不得不對單元測試中的Mockito2和Powermock框架的一些新特性進行研究:比如Mockito2和Powermock可以偽造靜態方法、final類甚至是建構函式的呼叫,但是研究一段後發現,這些功能其實在我本來就很熟悉的Jmockit框架中就能

單元測試()-樁對象

依賴項 基本原則 異常 spa log 控制 對象 工廠類 處理 在單元測試時,難免會碰到一些外部依賴,外部依賴是指在系統中代碼與其交互的對象,而且無法對其做人為控制,比如文件系統、線程、內存、時間、數據庫結果集等,這時可以使用偽對象(fake)來替代外部依賴,樁對象(st

【轉】Visual Studio單元測試小應用-執行時間

line Language cat parse esc net 技術分享 javascrip huang 【轉】Visual Studio單元測試小應用-測執行時間 Visual Studio的單元測試會記錄每一個測試的執行時間,如果有幾個Method要測效能,以前我會用

單元測試的藝術 ---- 系列文章

sts 系列文章 logs cnblogs cat href htm 藝術 tle .NET單元測試的藝術-1.入門 .NET單元測試的藝術-2.核心技術 .NET單元測試的藝術-3.測試代碼 出處:http://www.cnblogs.com/edisonchou/