這是這段時間結合 PHPunit 文件和大牛們的講解,想記錄下自己學習到的知識,未來參考補充,完善學到的東西
我們一般使用單測對公司業務裡的程式碼進行測試,他會幫忙找你的一個個小小的思考不夠全面的地方。 (雖然大牛說過開發可以先寫單測再來寫實現的程式碼,然而現在的我感覺離那個還是有很多距離來著)
stub(樁件):
「將物件替換為(
「將物件替換為(可選地)返回配置好的返回值的測試替身的實踐方法稱為上樁(stubbing)」——這是官方文檔給出的上樁解釋
現在倒回來看我才理解,怎麼說呢?舉個梨子。
====前提
我想測試的是這樣一個方法:switchClothes($username) ----透過名字查詢資料庫,性別是1的,就回到褲子,是0的,就回到裙子;
<?php Class Switch{ public function switchClothes($username){ $database=new database(); $gender=$databse->find("id=$username"); if($gender==0){ return "裙子"; }else{ return "裤子"; } } }
查詢資料庫我封裝了一個Database類別裡面的: find()
====開始寫測試
首先我需要測試的是database這個類別用select方法,查詢資料庫再來得到我到底要褲子還是裙子。所以,真的太麻煩了,我只是單純的想測測這個方法的邏輯好麼,萬一資料庫掛了,萬一這個username不存在,我難道還要專門去資料庫創造這樣一條數據麼,太麻煩了也不夠好。萬一需要測試包含更新資料的方法,難道還要真的修改資料麼?
stub就華麗麗降臨了。媽媽再也不用擔心我要去操作資料庫,再也不擔心介面不通神馬的了。
我可以對這個類別進行上樁。說通俗點,我覺得就是對這個類別進行了一個模擬,做了一個假的database類別;
如上如 A=switchClothes B=database類 D=資料庫 C=stub 的那個類別🀜『『〜〜〜〜〜〟〜 B,B查詢資料庫的.
但是C的存在就走了紅色那條線,C不會去查數據庫,C是被我掌控的,我可以指定裡面的find()方法返回1或者0 至少在A看來它跟B一樣,反正會給我回個0或1來的。這就等於C 將A與B,D這個體系隔絕了開來,減少了耦合;
然後,就可以開始構造我需要的C了。
<?php use PHPUnit\Framework\TestCase; class StubTest extends TestCase { public function testStub() { // 为database类建立桩件。 $stub = $this->getMockBuilder("database")//类名 ->setMethods(array('find')) //可以是多个方法 ->getMock(); // 配置桩件。 $stub->method('find')//想要设置返回值的方法 ->willReturn(0);//设置返回值 // 现在调用 $stub->select() 将返回 '裙子'。 $this->assertEquals('裙子', $stub->find()); } } ?>
這就是C了。
單測的時候,走紅色那條路就行了。
all