自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

PHP單元測(cè)試與數(shù)據(jù)庫(kù)測(cè)試

開(kāi)發(fā) 測(cè)試
做單元測(cè)試,質(zhì)量檢查,是需要一定的時(shí)間和人力投入的,但我敢保證地說(shuō),你花時(shí)間投入的,絕對(duì)不會(huì)是沒(méi)用的,一定對(duì)你,對(duì)項(xiàng)目來(lái)說(shuō),是一個(gè)質(zhì)的提升,只要你肯投入時(shí)間用心去做。

[[187830]]

我總感覺(jué) PHP 的開(kāi)發(fā)者們并沒(méi)有對(duì) PHP 的質(zhì)量有所追求,可能是因?yàn)?PHP 的機(jī)制問(wèn)題吧,讓大部分的開(kāi)發(fā)者總以為瀏覽器訪問(wèn)就沒(méi)有問(wèn)題,所以很多時(shí)候,做 PHP 開(kāi)發(fā)的,就沒(méi)有單元測(cè)試的這些概念了。能不能有點(diǎn)追求?

我個(gè)人也是 PHP,但同時(shí)我也比較討厭那些完事就算了的開(kāi)發(fā)者,作為一個(gè)開(kāi)發(fā)者,或者說(shuō)是一個(gè)產(chǎn)品的經(jīng)手人,就應(yīng)該用心地去做好每個(gè)細(xì)節(jié),一次比一次要更好。

但是做單元測(cè)試,質(zhì)量檢查,是需要一定的時(shí)間和人力投入的,但我敢保證地說(shuō),你花時(shí)間投入的,絕對(duì)不會(huì)是沒(méi)用的,一定對(duì)你,對(duì)項(xiàng)目來(lái)說(shuō),是一個(gè)質(zhì)的提升,只要你肯投入時(shí)間用心去做。

屁話說(shuō)太多了,那接下來(lái)簡(jiǎn)單講講 phpunit 吧,官網(wǎng)。

因?yàn)槲覀兞?xí)慣用 composer,所以我們也使用 composer 安裝吧。

安裝與配置 

  1. $ composer require phpunit/phpunit -vvv 

安裝完 phpunit,bin 執(zhí)行腳本會(huì)創(chuàng)建在 vendor/bin 目錄下,命名為 phpunit, 執(zhí)行 php vendor/bin/phpunit 執(zhí)行測(cè)試腳本

配置 bin 目錄:

  1.  
  2.   "config": { 
  3.  
  4.     "bin""bin" 
  5.  
  6.  } 
  7.  
  8.  

配置 bin 目錄產(chǎn)生的目錄,執(zhí)行 php bin/phpunit 腳本開(kāi)始測(cè)試。

phpunit 可以配置在當(dāng)前執(zhí)行路徑添加一個(gè)配置文件 phpunit.xml.dist 或者 phpunit.xml,內(nèi)容如下:

  1. <phpunit 
  2.          colors="true" 
  3.          bootstrap="./vendor/autoload.php" 
  4.         > 
  5.     <testsuites> 
  6.         <testsuite> 
  7.             <directory>dir1</directory> 
  8.         </testsuite> 
  9.         <testsuite> 
  10.             <directory>dir2</directory> 
  11.         </testsuite> 
  12.     </testsuites> 
  13. </phpunit>  

可以通過(guò)配置目錄和初始化信息,讓腳本自動(dòng)執(zhí)行對(duì)應(yīng)的測(cè)試用例。

基礎(chǔ)使用

使用 PHPUnit 創(chuàng)建我們的測(cè)試用例:

  1. <?php 
  2.  
  3. class DemoTest extends PHPUnit_Framework_TestCase 
  4.      public function testPushAndPop() 
  5.         { 
  6.             $stack = []; 
  7.             $this->assertEquals(0, count($stack)); 
  8.      
  9.             array_push($stack, 'foo'); 
  10.             $this->assertEquals('foo', $stack[count($stack)-1]); 
  11.             $this->assertEquals(1, count($stack)); 
  12.      
  13.             $this->assertEquals('foo', array_pop($stack)); 
  14.             $this->assertEquals(0, count($stack)); 
  15.         } 
  16.  

類(lèi)名需要以 *Test 結(jié)尾,繼承 PHPUnit_Framework_TestCase。需要測(cè)試的方法需要一 test 開(kāi)頭,表明是一個(gè)測(cè)試方法。

一般常用測(cè)試無(wú)非就是 "斷言",說(shuō)白了,就是看看產(chǎn)生的結(jié)果是不是符合預(yù)期,如果是,那就證明,已經(jīng)測(cè)試通過(guò),否則,失敗,說(shuō)明邏輯處理,存在一定的差異,導(dǎo)致不符合預(yù)期。

更多的測(cè)試使用方法請(qǐng)看官網(wǎng)用例: PHPUnit

初始化

當(dāng)我們的測(cè)試對(duì)象繼承了 PHPUnit 后,初始化方法就需要使用它本身提供的 setUp 方法,代表類(lèi)初始化,可以在初始化方法中初始化一些資源,或者加載。

數(shù)據(jù)庫(kù)測(cè)試

除了以上基礎(chǔ)的測(cè)試之外,關(guān)鍵一點(diǎn)應(yīng)該在動(dòng)態(tài)的數(shù)據(jù),需要去測(cè)試嗎,如果需要,那應(yīng)該怎么去測(cè)試? 生產(chǎn)環(huán)境,也需要這樣測(cè)試? 這個(gè)曾經(jīng)困惑這我的問(wèn)題,已經(jīng)解開(kāi)。

解答:

composer 中,有 --no-dev 選項(xiàng),用來(lái)部署生產(chǎn)環(huán)境,避免測(cè)試環(huán)境的數(shù)據(jù)或者代碼跑在了生產(chǎn)環(huán)境下。并且生產(chǎn)環(huán)境上數(shù)據(jù)庫(kù)操作是沒(méi)有很高權(quán)限的操作,要是有的話,你得回去面壁思考一下了。

dbunit 每次測(cè)試都重置數(shù)據(jù),其實(shí)在生產(chǎn)環(huán)境下,就重置不了了,***個(gè)是composer --no-dev 已經(jīng)沒(méi)有執(zhí)行權(quán)利了,要是有,數(shù)據(jù)庫(kù)已經(jīng)不允許清空操作了。

要是生產(chǎn)環(huán)境不需要這些東西,那么應(yīng)該怎么測(cè)試。其實(shí)需要有一個(gè)模擬生產(chǎn)環(huán)境的測(cè)試環(huán)境,去模擬生產(chǎn)環(huán)境測(cè)試,當(dāng)所有測(cè)試都OK沒(méi)有問(wèn)題,那么就可以發(fā)布到生產(chǎn)環(huán)境上,要是嚴(yán)格一些,生產(chǎn)環(huán)境也是需要一輪測(cè)試。

  1. $ composer require phpunit/dbunit -vvv 

更多測(cè)試可看: 數(shù)據(jù)庫(kù)測(cè)試

  1. <?php 
  2. class DBTest extends PHPUnit_Extensions_Database_TestCase 
  3.     /** 
  4.      * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection 
  5.      */ 
  6.     public function getConnection() 
  7.     { 
  8.         $pdo = new PDO('mysql::dbname=test;host=127.0.0.1''user''pass'); 
  9.         return $this->createDefaultDBConnection($pdo, ':memory:'); 
  10.     } 
  11.  
  12.     /** 
  13.      * @return PHPUnit_Extensions_Database_DataSet_IDataSet 
  14.      */ 
  15.     public function getDataSet() 
  16.     { 
  17.         return $this->createFlatXMLDataSet(dirname(__FILE__).'/_files/guestbook-seed.xml'); 
  18.     } 
  19.  

getConnection 方法是獲取數(shù)據(jù)庫(kù)連接,繼承數(shù)據(jù)庫(kù)測(cè)試后,必須實(shí)現(xiàn)的一個(gè)方法,并且需要返回 PHPUnit_Extensions_Database_DB_IDatabaseConnection 對(duì)象,可以仿照上述寫(xiě)法即可。

getDataSet 方法是數(shù)據(jù)集,在創(chuàng)建數(shù)據(jù)庫(kù)測(cè)試的時(shí)候,自動(dòng)填充,測(cè)試,和刪除。他執(zhí)行的流程是,每個(gè)測(cè)試用例,都會(huì)填充一次,以保證不會(huì)被其他測(cè)試用例影響。當(dāng)當(dāng)前測(cè)試用例測(cè)試完成后,會(huì) truncate 掉填充的數(shù)據(jù)。

數(shù)據(jù)集支持挺多種方法,可以自定義數(shù)組,yml,xml,可以根據(jù)自己的使用習(xí)慣,自定義填充數(shù)據(jù)。數(shù)據(jù)集可看: 點(diǎn)我

執(zhí)行腳本 php vendor/bin/phpunit

然后去對(duì)應(yīng)查看自己的數(shù)據(jù)表,是否多了一些填充的數(shù)據(jù)呢?

抽象自己的數(shù)據(jù)庫(kù)測(cè)試類(lèi)

在很多情況下,我們的業(yè)務(wù)可謂是各種各樣吧,倘若 phpunit 提供的數(shù)據(jù)庫(kù)測(cè)試還不能滿足或者不夠方便的時(shí)候,就需要擴(kuò)展自己的數(shù)據(jù)庫(kù)測(cè)試,來(lái)達(dá)到自己想要的效果。

幸好,phpunit 提供了靈活的擴(kuò)展操作(肯定啦,別人肯定不會(huì)像你這么傻,寫(xiě)死吧。哈哈),我們可以很容易地去實(shí)現(xiàn)自己的數(shù)據(jù)庫(kù)測(cè)試類(lèi)。

  1. <?php 
  2.  
  3. abstract class MyApp_Tests_DatabaseTestCase extends PHPUnit_Extensions_Database_TestCase 
  4.     // 只實(shí)例化 pdo 一次,供測(cè)試的清理和裝載基境使用 
  5.     static private $pdo = null
  6.  
  7.     // 對(duì)于每個(gè)測(cè)試,只實(shí)例化 PHPUnit_Extensions_Database_DB_IDatabaseConnection 一次 
  8.     private $conn = null
  9.  
  10.     final public function getConnection() 
  11.     { 
  12.         if ($this->conn === null) { 
  13.             if (self::$pdo == null) { 
  14.                 self::$pdo = new PDO('mysql::dbname=test;host=127.0.0.1''user''pass'); 
  15.             } 
  16.             $this->conn = $this->createDefaultDBConnection(self::$pdo, ':memory:'); 
  17.         } 
  18.  
  19.         return $this->conn; 
  20.     } 
  21.  

至今為止,完成了最基礎(chǔ)和入門(mén)的單元測(cè)試和數(shù)據(jù)庫(kù)測(cè)試,最終數(shù)據(jù)庫(kù)無(wú)非就是查看數(shù)據(jù)增刪改查是否和預(yù)期一樣。所以,配置完數(shù)據(jù)庫(kù)測(cè)試后,就可以走回***步,編寫(xiě)你的測(cè)試用例,斷言測(cè)試了。

恭喜你,你已經(jīng)構(gòu)建完自己的單元測(cè)試環(huán)境了。接下來(lái)需要做的是,提高易用性,測(cè)試覆蓋率。我只能幫你到這里了,接下來(lái)的路,自己走吧。

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2017-01-14 23:42:49

單元測(cè)試框架軟件測(cè)試

2011-01-25 10:42:29

Visual Stud

2011-02-15 10:05:48

PHPPHPUnit

2009-09-01 10:20:06

protected方法單元測(cè)試

2021-08-04 10:51:04

數(shù)據(jù)庫(kù)單元測(cè)試SQL

2020-08-18 08:10:02

單元測(cè)試Java

2011-02-16 09:45:13

PHPPHPUnit

2017-02-21 10:30:17

Android單元測(cè)試研究與實(shí)踐

2017-01-14 23:26:17

單元測(cè)試JUnit測(cè)試

2017-01-16 12:12:29

單元測(cè)試JUnit

2011-05-16 16:52:09

單元測(cè)試徹底測(cè)試

2017-03-23 16:02:10

Mock技術(shù)單元測(cè)試

2011-02-21 09:54:14

PHPPHPUnit

2021-05-05 11:38:40

TestNGPowerMock單元測(cè)試

2023-07-28 10:27:48

Java單元測(cè)試

2023-07-26 08:58:45

Golang單元測(cè)試

2011-07-04 18:16:42

單元測(cè)試

2020-05-07 17:30:49

開(kāi)發(fā)iOS技術(shù)

2020-07-07 07:33:12

Java單元集成

2011-04-18 13:20:40

單元測(cè)試軟件測(cè)試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)