PHPUnit 單元測試入門筆記

PHPUnit 單元測試入門筆記

爲何要進行單元測試?

項目代碼常常修改,每每修改一下地方後,其它地方可能相應地也須要做一些修改,但經常被忽視了,從而常常出現各類小 bug,怎樣減小這類錯誤? 一種是使用強類型,能夠發現一些簡單的錯誤;另外一個就是使用單元測試,固然返回結果不符合預期時意味着代碼可能有 bug .php

單元測試須要作什麼?

每一個公共函數或接口的返回值有固定的數據類型與結構,經過判斷結果值是否符合預期來排除一些簡單的錯誤。 運行測試時,但願一條命令運行全部測試代碼,多是跨文件甚至是跨目錄。 phpunit 是一個可能實現單元測試經常使用須要的工具。html

單元測試以外的測試:

單元測試不能解決全部問題,單元測試主要測試函數的返回值,而具體頁面的呈現是否正確,須要模仿瀏覽器行爲來進行測試,好比php-webdriver,chrome拓展程序等都是能夠考慮的方法。web

單元測試的覆蓋率能不能達到100%?

若是簡單粗暴地計算,只要是有測試的函數或方法就是覆蓋,那答案是能夠。 但每一個函數的全部可能都測試到? 這個應該是不可能的,否則,程序就永遠不會出 bug 了。 單元測試的目的是減小 bug ,而沒有人能保證程序絕對不會有 bug 。chrome

下載與安裝:

  1. 下載各個版本的地址:https://phar.phpunit.de/ 搜索:phpunit-5.

其中php5.6 對應 phpunit5.X 版本bootstrap

phpuint6.X 要求 php7.0以上windows

  1. 在phpunit.phar 同級目錄建立一個文件,文件名爲:phpunit.bat (windows環境下)

內容爲:瀏覽器

@ php %~dp0phpunit-5.7.9.phar %*

而後把該目錄添加到環境變量中,安裝完成 運行php7

phpunit -v

測試一下便可app

測試單個文件

hahaTest.php 的基本內容能夠這樣寫:函數

<?php
use PHPUnit\Framework\TestCase;

require("./src/index.php");

class hahaTest extends TestCase{
    //必須是public且方法名是test開頭的纔會參與測試,protected和private的測試時會提示錯誤
    public function test_index(){
        $index=new index();//index.php中的類
        $re=$index->haha();
        $this->assertEquals(1,$re);//測試 ./src/index.php 中的index類的haha方法返回值是否是1
    }
}

命令行運行:

phpunit hahaTest.php

測試整個文件夾的方法:

  • 遞歸讀取文件夾下全部的文件命名爲 *Test.php,若是文件名不是Test.php結尾的,不會加載到測試
  • 每一個方法必須以test開關,不然會直接跳過
  • 方法的權限必須是 public
  • 運行 phpunit 目錄名,便可

phpunit 中依賴 (@depends) 的使用:

  • depends 的使用:
/**  //必須是文檔註釋,不能自動生成文檔註釋的要注意一下:第一行必定要兩個*號
   * @depends test_haha 提供數據的函數的返回值做爲參數 
   */
  public function test_hehe($re){
      //$re 是 test_haha 的返回值,能夠在這個方法內使用
  }
  • 最好先建立一個基類:baseTest繼承自 TestCase類,文件名爲aaTest.php,寫aa是保證讓它最早被加載,加Test是由於不加的不會被加載運行。 aaTest.php 文件中能夠寫公共函數,須要公共引進的,一些前置的操做,而後其它測試類繼承這個類就能夠了

  • 另外一種解決方案: 使用 phpunit.xml 文件,把啓動須要的內容寫到 base.php 文件,而後在 phpunit 的 bootstrap 屬於中引入該文件 執行 phpunit dir 時,若是沒有添加 -c phpunit.xml 的話,它會自動在當前目錄下查找phpunit.xml或phpunit.xml.dist文件,經過配製文件,能夠指定加載順序 在配置中引入了的文件會優先加載,而後會默認加載*Test.php文件

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="./Index/baseTest.php">
  <testsuites>
    <testsuite name="index">
      <file>./Index/loginTest.php</file> //寫了的會優先加載
    </testsuite>
  </testsuites>
</phpunit>

問題

  • 怎樣指定測試文件的順序?

<!-- 使用 phpunit.xml 配置文件,寫在testsuite 中的會優先加載,而且按寫的順序加載 -->

  • 跨文件/跨類 怎樣使用@depends

<!-- 目前的解決方法:繼承須要依賴的類,再重寫須要依賴的方法,直接經過parent:: 來調用,這樣就可使用 @depends 了 補充:這樣會有問題,繼承其它測試類,會沒被繼承的方法重複測試, 經測試後發現,直接使用 類名::方法名 是能夠添加到依賴的 -->

  • 怎樣知道哪些測試方法被 phpunit 跳過了?

<!-- 運行時,添加 -v 參數,如: phpunit index -v -->

相關文章
相關標籤/搜索