淺談如何提高PHP程式碼質量之端到端整合測試
概述
在這裡,我們可以使用為行為驅動開發構建的工具——官方 php 的 Cucumber 實現——Behat。我們可以通過執行以下程式碼來安裝它:
$ php composer.phar require --dev behat/behat
增加一個目標到 build.xml(在本文的第一部分中描述了 Phing 設定)
<target name="behat"> <exec executable="bin/behat" passthru="true" checkreturn="true" /> </target>… <target name="run" depends="phpcs,phpcpd,phan,phpspec,behat" />
然後,你應該為檔案 features/price.feature 的測試建立一個規範。
Feature: Price Comparison In order to compare prices As a customer I need to break the currency barrier Scenario: Compare EUR and PLN Given I use nbp.pl comparator When I compare “100EUR” and “100PLN” Then It should return some result
這個測試場景非常容易閱讀,並且應該給你一個關於該特性應該如何工作的良好印象。不幸的是,計算機通常並不真正理解人類語言,所以現在是為每一步編寫程式碼的時候了。
你可以通過執行 ./bin/behat-init 來生成它的程式碼模板。它應該會建立一個這樣的類:
//features/bootstrap/FeatureContext.php use Behat\Behat\Context\SnippetAcceptingContext; use Behat\Gherkin\Node\PyStringNode; use Behat\Gherkin\Node\TableNode; class FeatureContext implements SnippetAcceptingContext{ /** * Initializes context. */ public function __construct() { } }
然後你可以執行:
$ bin/behat --dry-run --append-snippets
Behat 將自動為場景中定義的每個步驟建立函式。
現在你可以通過填充函式的主體來開始實現真正的檢查:
// features/bootstrap/FeatureContext.php <?php use Behat\Behat\Context\Context; use Domain\Price;use Domain\PriceComparator; use Infrastructure\NBPPriceConverter; /*** Defines application features from the specific context.*/ class FeatureContext implements Context{ /** @var PriceComparator */ private $priceComparator; /** @var int */ private $result; /** * Initializes context. * * Every scenario gets its own context instance. * You can also pass arbitrary arguments to the* context constructor through behat.yml. */ public function __construct() { } /** * @Given I use nbp.pl comparator */ public function iUseNbpPlComparator() { $this->priceComparator = new PriceComparator(new NBPPriceConverter()); } /** * @When I compare :price1 and :price2 */ public function iCompareAnd($price1,$price2) { preg_match('/(\d+)([A-Z]+)/',$price1,$match1); preg_match('/(\d+)([A-Z]+)/',$price2,$match2); $price1 = new Price($match1[1],$match1[2]); $price2 = new Price($match2[1],$match2[2]); $this->result = $this->priceComparator->compare($price1,$price2); } /** * @Then It should return some result */ public function itShouldReturnSomeResult() { if (!is_int($this->result)) { throw new \DomainException('Returned value is not integer'); } } }
最後,使用 ./bin/phing 執行所有的測試。你應該得到以下結果:
Buildfile: /home/maciej/workspace/php-testing/build.xmlMyProject > phpcs: MyProject > phpcpd: phpcpd 4.0.0 by Sebashttp://www.cppcns.comtian Bergmann.0.00% duplicated lines out of 103 total lines of code. Time: 17 ms,Memory: 4.00MB MyProject > phan: MyProject > phpspec: / skipped: 0% / pending: 0% / passed: 100% / failed: 0% / broken: 0% / 3 examples2 specs3 examples (3 passed)15ms MyProject > behat: Feature: Price Comparison In order to compare prices As a customer I need to break the currency barrier Scenario: Compare EUR and PLN # features/price.feature:6 Given I use nbp.pl comparator # FeatureContext::iUseNbpPlComparator() When I compare "100EUR" and "100PLN" # FeatureContext::iCompareAnd() Then It should return some result # FeatureContext::itShouldReturnSomeResult()1 scenario (1 passed)3 steps (3 passed)0m0.01s (9.13Mb) MyProject > run: BUILD FINISHED Total time: 1.1000 second
正如你所看到的,Behat 準備了一份很好的報告,說明我們的應用程式做了什麼,結果是什麼。下一次,當專案經理詢問你在測試中涉及到哪些場景時,你可以給他一個 Behat 輸出!
1、測試的結構
每個測試都包括:
- 對該場景的一些準備,用“Given”部分表示
- “When”部分所涵蓋的一些動作
- 一些檢查被標記為“Then”部分
每個部分都可以包含多個與“And”關鍵字連線的步驟:
Scenario: Compare EUR and PLN Given nbp.pl comparator is avai程式設計客棧lable And I use nbp.pl comparator When I compare "100EUR" and "100PLN" And I save the result Then It should return some result And the first amount should be greater
2、上下文
Behat http://www.cppcns.com允許你為你的測試定義多個上下文。這意味著你可以將步驟程式碼分割成多個類,並從不同的角度去測試你的場景。
你可以例如:為 web 上下文編寫程式碼,它將使用你的應用程式 HTTP 控制器執行你的測試步驟。你還可以建立“domain”上下文,它將只使用 PHP API 呼叫來執行你的業務邏輯。通過這種方式,你可以單獨地測試業務邏輯整合,從端到端應用程式測試。
關於如何在 Behat 建立許多上下文的更多資訊,請參考http://behat.org/en/latest/userguide/context.html的文件。
3、如何hYJvCYmgfg使用Behat
正如一開始所提到的,你可以使用 Behat 進行整合測試。通常情況下,你的程式碼依賴於一些外部的第三方系統。當我們在第 2 部分中編寫單元測試時,我們總是假設外部依賴關係像預期的那樣工作。使用 Behat,你可以編寫測試場景,它將自動執行你的程式碼,並檢查它是否正確地使用真實場景的服務。
最重要的是,Behat 對於測試系統使用的複雜的端到端場景非常有用。它允許你隱藏在一個可讀性的名字後面執行測試步驟所需的複雜程式碼,並編寫一個人人都能理解的場景。
總結
從以上的文章中,你已經學習瞭如何在你的專案中設定六個有用的工具:
- PHing 用於執行你的構建
- PHPCS 用於自動檢查程式碼格式
- PHPCPD 用於檢測重複程式碼的
- Phan 用於高階靜態程式碼分析程式設計客棧
- PHPSpec 用於單元測試
- Behat 用於端到端和整合測試
現在,你可以向 git 提交鉤子新增 ./bin/phing,並設定持續整合來執行每個提交的測試。
是不是突然之間,沒有什麼能阻止你寫出高質量的 PHP 程式碼!
以上就是淺談如何提高PHP程式碼質量之端到端整合測試的詳細內容,更多關於如何提高PHP程式碼質量之端到端整合測試的資料請關注我們其它相關文章!