国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[譯] Laravel 5 之美 - 單元測試

fuyi501 / 2678人閱讀

摘要:事實上,這是討論測試的惟一一章。因此,在中沒有單一的測試方法。包含了這是的標準強調業務或特性測試是最流行的框架。然后我們在這個項目中使用進行單元測試。在隨后的章節中,將不再進行測試。

原文地址: Laravel 5.1 Beauty - Testing

Note 本系列第四節內容.

本章會創建一個以后可以用到的項目便于以后我們的課程使用, 同時也會查課各種測試選項. 以后一段時間內會開發一個 Markdown 文本轉換成 Html 的服務信息.

創建 l5beauty 項目

根據之前的章節 Six Steps to Starting a New Laravel 5.1 Project 創建 l5beauty 項目下面所示項目

首先在你的系統安裝 app 框架

Step 1 - 安裝項目框架
$ laravel new l5beauty
Crafting application...
Generating optimized class loader
Compiling common classes
Application key [rzUhyDksVxzTXFjzFYiOWToqpunI2m6X] set successfully.
Application ready! Build something amazing.

接下來設置 l5beauty.app 作為虛擬主機.

Step 2 - 配置服務器
$ serve l5beauty.app ~/l5beauty/public
dos2unix: converting file /vagrant/scripts/serve.sh to Unix format ...
 * Restarting nginx nginx                                                [ OK ]
php5-fpm stop/waiting
php5-fpm start/running, process 2169

回到主機, 添加以下記錄到映射文件

Step 3 - 添加 l5beauty.app 到映射文件
192.168.10.10  l5beauty.app

從主機中, 按照以下步驟安裝 NPM 本地包

Step 4 - NPM 本地安裝
$ cd l5beauty
$ npm install
|
> node-sass@2.0.1 install /Users/chuck/Code/l5beauty/node_modules/laravel-
    elixir/node_modules/gulp-sass/node_modules/node-sass
> node scripts/install.js

> node-sass@2.0.1 postinstall /Users/chuck/Code/l5beauty/node_modules/
    laravel-elixir/node_modules/gulp-sass/node_modules/node-sass
> node scripts/build.js

`darwin-x64-node-0.10` exists; testing
Binary is fine; exiting
gulp@3.8.11 node_modules/gulp
├── v8flags@2.0.2
├── pretty-hrtime@0.2.2

[snip]

回到主機, 創建數據庫

Step 5 - 創建應用數據庫
$ mysql --user=homestead --password=secret
mysql> create database l5beauty;
Query OK, 1 row affected (0.00 sec)

mysql> exit;
Bye

編輯 .env 文件, 修改數據庫為 l5beauty.

Step 6 - 更改配置文件中的 DB_NAME
// Change the following line
DB_DATABASE=homestead

// To the correct value
DB_DATABASE=l5beauty

最后, 訪問 http://l5beauty.app , 確保一切可用.

Figure 6.1 - Step 5 - 在瀏覽器中測試

運行 PHPUnit

Laravel 5.1 已經準備好測試了, 有個最簡單的方式來檢測一個訪問是否返回200響應.

運行 PHPUnit , 簡單的在根目錄上執行 phpunit就OK

運行 PHPUnit
$ cd l5beauty
~/l5beauty $ phpunit
PHPUnit 4.7.4 by Sebastian Bergmann and contributors.

Time: 544 ms, Memory: 10.25Mb

OK (1 test, 2 assertions)
是否有錯誤 ?

如果你在運行 phpunit 收到 command not found 或者 permissions denied 錯誤提示, 有可能是因為安裝問題. phpunit 命令一般會存放在 vendor/bin 目錄并且添加進系統變量, 問題是 Laravel 命令有一個bug是沒有給這個命令設置相應的權限

使用如下方法解決這個問題:

Step 1 - 刪除 vendor 目錄

Step 2 - 在代碼根目錄使用 composer update 命令重新創建 vendor 目錄. (操作系統中運行)

這樣, 然后重新執行 phpunit

Laravel 5.1 PHPUnit 配置

在 Laravel 5.1 項目根目錄中有個文件 phpunit.xml. 這個文件包含使用 phpunit 運行時候的配置

phpunit.xml的測試會放置在 tests 目錄, 這里有兩個文件

ExampleTest.php - 包含一個測試方法 testBasicExample(). 這個 ExampleTest 類集成自 TestCase 類.

TestCase.php - Laravel 基礎測試單元.

查看 testBasicExample() 方法 ExampleTest.php.

testBasicExample() 方法
  public function testBasicExample()
  {
    $this->visit("/")
         ->see("Laravel 5");
  }

這個測試告訴我們 "訪問主頁并且能夠看到內容 ‘Laravel 5’", 還能比這個更簡潔么 ?

TestCase 類提供在框架中的應用方法和屬性. TestCase 同樣提供了一個附加斷言列表方法和 crawler 類型測試

Laravel 5.1 Crawler 方法和屬性

Crawler 允許你測試web應用. 這些方法都有個統一的優點就是都能夠返回 $this , 允許你創建 ->visit()->see() 類似這樣的鏈式調用.

下邊是一些屬性和方法:

$this->response

web應用返回的最后的響應

$this->currentUri

當前查看的Uri

visit($uri)

(Fluent) 使用 get 方法訪問給定的uri

get($uri, array $headers = [])

(Fluent) 使用 get 方法訪問url, 并可以傳輸給定的header

post($uri, array $data = [], array $headers = [])

(Fluent) post 請求

put($uri, array $data = [], array $headers = [])

(Fluent) put 請求

patch($uri, array $data = [], array $headers = [])

(Fluent) PATCH 請求

delete($uri, array $data = [], array $headers = [])

(Fluent) DELETE 請求

followRedirects()

(Fluent) 跟蹤最近返回的重定向

see($text, $negate = false)

(Fluent) 查找頁面上顯示的內容/顯示/不顯示

seeJson(array $data = null)

(Fluent) 判定請求包含 json, 如果傳輸了 $data 參數, json 值必須匹配.

seeStatusCode($status)

(Fluent) 相應是否返回指定的狀態碼

seePageIs($uri)

(Fluent) 當前頁面是否是指定的URI

seeOnPage($uri) and landOn($uri)

(Fluent) Alias seePageIs()

click($name)

(Fluent) 通過name 或者 id 來請求點擊

type($text, $element)

(Fluent) 填充自定義的文本

check($element)

(Fluent) 檢測頁面的checkbox

select($option, $element)
(Fluent) 選擇下拉項

attach($absolutePath, $element)

(Fluent) 附件

press($buttonText)

(Fluent) 提交指定文本的text

withoutMiddleware()

(Fluent) 禁用 middleware

dump()

輸入最近返回的內容

Laravel 5.1 PHPUnit 應用方法

這里有額外的 Laravel 5.1 方法和屬性

$app

$app 實例

$code

artisan 返回的最近的 code 碼

refreshApplication()

刷新應用, setup()方法會自動調用這個方法.

call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)

調用指定的url 并且返回響應.

callSecure($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)

調用 https 訪問url并且返回響應

action($method, $action, $wildcards = [], $parameters = [], $cookies = [], $files = [], $server = [], $content = null)

調用控制器方法

route($method, $name, $routeParameters = [], $parameters = [], $cookies = [], $files = [], $server = [], $content = null)

調用路由并且返回方法.

instance($abstract, $object)

注冊對象的實例

expectsEvents($events)

指定可能被觸發的事件列表.

withoutEvents()

不調用事件

expectsJobs($jobs)

注冊隊列

withSession(array $data)

使用session

session(array $data)

開始并設置 session

flushSession()

刷新當前session 的內容

startSession()

開始 session

actingAs($user)

(Fluent) 設置當前登錄的用戶

be($user)

設置用戶

seeInDatabase($table, array $data, $connection = null)

(Fluent) 檢測給定的數據是否存在在數據庫中

notSeeInDatabase($table, $array $data, $connection = null)

(Fluent) 檢測數據是否不存在數據庫中

missingFromDatabase($table, array $data, $connection = null)

(Fluent) Alias notSeeInDatabase().

seed()

數據庫數據seed 生成器

artisan($command, $parameters = [])

指定 artisan 命令并且返回代碼

上邊的方法/屬性都能夠在 test 中 使用, 默認的 ExampleTest.php 中存在一個方法 testBasicExample(), 這個調用了 $this->call(...) 方法.

Laravel 5.1 PHPUnit 斷言

除了標準的 PHPUnit 斷言(assertEquals(), assertContains(), assertInstanceOf(), ...)之外, 還存在很多允許測試 web 應用的檢測項目

assertPageLoaded($uri, $message = null)

檢測最近的頁面是否被加載, 如果不存在 url / message 時候會報錯

assertResponseOk()

是否頁面相應OK

assertReponseStatus($code)

是否響應指定的code

assertViewHas($key, $value = null)

視圖中是否存在指定的數據

assertViewHasAll($bindings)

視圖中是否存在指定的一系列數據

assertViewMissing($key)

指定視圖中是否不存在這個數據

assertRedirectedTo($uri, $with = [])

檢測是否重定向到指定的uri

assertRedirectedToRoute($name, $parameters = [], $with = [])

是否客戶端重定向到指定的路由

assertRedirectedToAction($name, $parameters = [], $with = [])

是否重定向到 action

assertSessionHas($key, $value = null)

session 中是否存在 key/ value

assertSessionHasAll($bindings)

session 中是否存在指定的 kv

assertSessionHasErrors($bindings = [])

session 是否存在錯誤

assertHasOldInput()

session 中是否存在以前的數據

使用 Gulp 來進行 TDD 測試

Gulp 是用javascript 寫成的編譯和自動化工具. 基本用來最小化源代碼或者從源代碼生成文件. Gulp 能夠監控源代碼的改變并且自動運行指定的任務

Laravel 5.1 存在 Laravel Elixir 允許運行 gulp 任務. Elixir 加入了更簡潔的語法. 你這樣想 PHP 中的 Laravel, Gulp 中的 Elixir.

一個最常用的 Gulp 是自動化測試. 我們根據 TDD (Test Driven Development) 來自動化運行我們的測試任務.

首先, 編輯 gulpfile.js 文件, 并按照以下修改.

配置 Gulp 來運行 PHPUnit 測試
var elixir = require("laravel-elixir");

elixir(function(mix) {
    mix.phpUnit();
});

這里我們調用 elixir() 方法. 傳遞一個函數. 這個函數接收一個 mix 對象. 這個函數能夠干很多你可能想都想不到的事情. 你可能想通過 less 文件編譯 css 文件. 然后合并 css 文件, 然后再文件末尾加綴上版本號. 所有的這些事情都可以通過 mix 對象來運行.

但是現在, 我們僅僅運行 PHPUnit 測試.

接下來, 直接運行 glup

運行 Gulp
~% cd Code/l5beauty
~/Code/l5beauty% gulp
[15:26:23] Using gulpfile ~/Code/l5beauty/gulpfile.js
[15:26:23] Starting "default"...
[15:26:23] Starting "phpunit"...
[15:26:25] Finished "default" after 2.15 s
[15:26:25]

*** Debug Cmd: ./vendor/bin/phpunit --colors --debug ***

[15:26:28] PHPUnit 4.7.4 by Sebastian Bergmann and contributors.

Configuration read from /Users/chuck/Code/l5beauty/phpunit.xml

Starting test "ExampleTest::testBasicExample".

Time: 2.07 seconds, Memory: 10.25Mb

OK (1 test, 2 assertions)
[15:26:28] gulp-notify: [Green!]
[15:26:28] Finished "phpunit" after 4.96 s

你可能收到一個通知, 一個彈框, 綠色告知你所有測試都已經通過了

Figure 6.2 - Gulp’s PHPUnit Success on Windows 8.1

想要使用 gulp進行自動化測試, 運行 gulp tdd

運行 Gulp
~% cd Code/l5beauty
~/Code/l5beauty% gulp tdd
[15:29:49] Using gulpfile ~/Code/l5beauty/gulpfile.js
[15:29:49] Starting "tdd"...
[15:29:49] Finished "tdd" after 21 ms

這個命令掛載在這里, 監聽源文件的變化, 并且在需要的時候進行單元測試.

想要查看如何運行的. 讓我們中段存在的單元測試.

改變 tests/ExampleTest.phpsee() 方法.

中段 ExampleTest.php
->see("Laravel 5x");

當你保存這個文件, gulp 將會通知并且重新運行 PHPUnit , 這個將會執行錯誤. 然后你會看到一個紅色的錯誤提示

Figure 6.3 - Gulp’s PHPUnit Failure on Mac

如果你要重新更改回來,保存, 然后 gulp 會重新運行 PHPUnit, 然后你會看到綠色的圖標

退出 Gulp’s tdd 模式

按下 Ctrl+C

創建 Markdown 服務

在博客應用中我們會使用 Markdown 語法來寫文章, 如果你不熟悉 markdown, 可以通過連接來檢查這個語法, 這是一個快速讀/寫并且能夠保存為 HTML.

舉例說明, 我們會創建一個服務項目來生成HTML.

拉取一個 Markdown 包

這里有許多的PHP包來把markdown 轉換為HTML, 如果你去 http://packagist.org 這里搜索 markdown , 會發現 20 多頁的包.

我們會使用 Michel Fortin 創建的包. 因為"好", 接下來我們運行如下的命令來拉取這個包

添加 Markdown 和 SmartyPants
~/Code/l5beauty% composer require michelf/php-markdown
Using version ^1.5 for michelf/php-markdown
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing michelf/php-markdown (1.5.0)
    Downloading: 100%

Writing lock file
Generating autoload files
Generating optimized class loader

~/Code/l5beauty% composer require "michelf/php-smartypants=1.6.0-beta1"
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing michelf/php-smartypants (1.6.0-beta1)
    Loading from cache

Writing lock file
Generating autoload files
Generating optimized class loader

你有沒有注意到指定了包版本號. 這是因為寫這篇文章的時候還沒有一個穩定的版本號能夠自動拉取到

創建 Markdown 測試類

開始 TDD session 的第一件事就是開啟 TDD 模式

Starting Gulp in TDD mode
~/Code/l5beauty% gulp tdd
[19:41:38] Using gulpfile ~/Code/l5beauty/gulpfile.js
[19:41:38] Starting "tdd"...
[19:41:38] Finished "tdd" after 23 ms

現在 gulp 監控 PHPUnit 的改變. 讓我們創建測試類

tests 目錄, 創建一個新文件夾命名為 Services 同時創建一個文件 MarkdownerTest.php

初始化 tests/Services/MarkdownerTest.php
markdown = new AppServicesMarkdowner();
    }
    
    # 測試
    public function testSimpleParagraph()
    {
        $this->assertEquals(
            "

test

", $this->markdown->toHTML("test") ); } }

這里會報錯

即使告訴你檢測失敗, 日志中也會存在相應的錯誤日志, 這里很明顯的是 AppServicesMarkdowner 這個類不存在.

創建 Markdowner 服務

這里我們創建一個服務來封裝 php-markdown 和 php-smartypants 來加載導入的服務

appServices 目錄創建一個 Markdowner.php 服務并填寫以下的內容 .

app/Services/Markdowner 的內容
preTransformText($text);
        $text = MarkdownExtra::defaultTransform($text);
        $text = SmartyPants::defaultTransform($text);
        $text = $this->postTransformText($text);
        return $text;
    }
    
    protected function preTransformText($text)
    {
        return $text;
    }
    
    protected function postTransformText($text)
    {
        return $text;
    }
}

當你保存了這個文件, Gulp 應當顯示一個綠色的提示框. 告訴你執行OK.

如果你沒有收到綠色的提示. 檢測文件和測試類.

更多測試

大家都同意的是, 這不是一個好的 TDD 測試例子, 因為太簡單了. 實際的會有好多操作步驟和迭代, 如下

創建 MarkdownerTest w/ testSimpleParagraph()

Tests Fail

創建 Markdowner 類, 硬編碼 toHTML() 來通過測試

Tests Succeed

更新 Markdowner 類來使用 MarkdownExtra

Tests Succeed

添加一個 testQuotes() 到 MarkdownerTest 類

Tests Fail

更新 Markdowner 類來使用 SmartyPants

Tests Succeed

目前為止, 所有的我們 Markdowner 類在測試前都是不完整的.要在該類上進行 單元測試,應該將其結構化以便將 MarkdownExtraSmartyPants 類的實例注入到構造函數中, 通過這種方式我們的單元測試可以注入模擬對象,并且只驗證 MarkdownExtra 的行為,而不是它所調用的類.

但這不是一本關于測試的書。事實上,這是討論測試的惟一一章。我們會離開這個結構,但需要再添加幾個測試。

更新 MarkdownerTest 來和下面的內容一致

app/Services/Markdowner 的最終內容
markdown = new AppServicesMarkdowner();
    }
    
    /**
    * @dataProvider conversionsProvider
    */
    public function testConversions($value, $expected)
    {
        $this->assertEquals($expected, $this->markdown->toHTML($value));
    }
    
    public function conversionsProvider()
    {
        return [
            ["test", "

test

"], ["# title", "

title

"], ["Here"s Johnny!", "

Here’s Johnny!

"], ]; } }

在這里,我們更改了測試類用來一次測試多個轉換,并在 conversionsProvider() 中添加了三個測試。在進行下一步驟之前,你的測試結果應該是綠色的。

在系統控制臺中一旦測試是綠色的,按 Ctrl+C 來停止 Gulp

測試的其他方法

這里并不是想使用 Laravel 5.1 提供一個完整的測試方法,因為在PHP中沒有多帶帶的方法來進行測試。

因此,在 Laravel 5 5.1 中沒有單一的測試方法。

但是,我們將探索一些替代方案

phpspec

除了 PHPUnit ,Laravel 5.1 還提供了 phpspec 。這是另一種流行的PHP測試,它更多地關注于 BDD(行為驅動開發)

這里有一些關于phpspec的注釋。

程序文件在 vendor/bin, 因此你可以在項目根目錄下調用 phpspec.

配置文件在根目錄, 名字是 phpspec.yml.

從 Gulp 中運行 phpspec , Elixir 提供了 phpSpec() 函數, 你可以在 mix 對象中運行.

如果你把程序的命名空間從 App 改成其他的命名空間, 確保同步更新 phpspec.yml 中的配置.

單元測試

雖然 PHPUnit 是 PHP 單元測試的標準,但也有其他的包可以使用

Enhance PHP - 單元測試框架支持 mocks 和 stubs.

SimpleTest - 另一個使用 mock 的單元測試框架.

功能 / 驗收測試

這些測試真實的使用了您的應用程序,而不是僅僅驗證您的應用程序中的代碼單元。當使用流暢的測試方法 Laravel 5.1 時,你可以使用 PHPUnit 進行一些功能測試. ExampleTest.php 提供了一個簡單的示例. 但是也有其他的測試框架關注于功能/驗收測試(functional / acceptance testing).

Codeception - 驗收測試最流行的框架.

Selenium - 瀏覽器自動化.

Mink - 瀏覽器自動化.

行為驅動開發 (BDD)

BDD(行為驅動開發)有兩種方式: SpecBDD 和 StoryBDD

SpecDD 關注代碼的技術方面。Laravel 5.1 包含了 _phpspec_, 這是SpecDD的標準

StoryBDD 強調業務或特性測試. Behat 是最流行的 StoryBDD 框架。同樣 Codeception 也可以用于 StoryBDD 。

回顧

我們在這一章所做的第一件事就是創建一個名為 l5beauty 的項目。然后我們在這個項目中使用 PHPUnit 進行單元測試。最后,我們創建了一個 Markdowner 服務類,這有兩個目的 一是測試, 二是并在以后將 markdown 轉換為 HTML 。

這是一個相當長的章節,因為測試是一個很大的話題,而一個章節無法給出公正的評價。但是,正如我所提到的,測試并不是本書的重點。在隨后的章節中,將不再進行測試。

下一章我們討論一些如何讓系統更快的話題如何?

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25884.html

相關文章

  • [] Laravel 5 之美 - 2) 安裝運行時必要軟件和組件

    摘要:對于來說,在主機操作系統上運行是絕對必要的。在和中,從主機操作系統中運行可以出現系統通知。你仍然可以在或的虛擬機中成功地運行,但在發出通知時將收到警告錯誤僅從你的主機操作系統運行。 原文地址: Laravel 5.1 Beauty - Required Software and Components 怎樣安裝開發 Laravel 5.1 必要的軟件: VirtualBox 和 Vagr...

    alaege 評論0 收藏0
  • [] Laravel 5 之美 - 1) 介紹

    摘要:原文地址我的新書的簡要介紹長期支持是第一個長期支持發行版。這意味著提供了年的修復,并且提供了年的安全補丁。但并不是一個真正的能夠涵蓋方方面面的手冊。 原文地址: Laravel 5.1 Beauty - Introduction 我的新書 About Laravel 5.1 的簡要介紹 長期支持 Laravel 5.1 是第一個LTS(長期支持) Laravel 發行版。這意味著提供了...

    yibinnn 評論0 收藏0
  • [] Laravel 5 之美 - 3) 設置 windows 機器

    摘要:通過單擊確定關閉所有剩余窗口。中的任何其他的使用都將通過命令提示符來操作。檢查版本關閉所有打開的命令提示符并打開一個新的命令提示符。首次啟動現在,虛擬機正在運行。將會話主機名設置為,端口為將保存為。 原文地址: Laravel 5 Beauty - Setting up a Windows Machine 如何為 Laravel 5.1 開發做好準備 注意 這是本教程的第二步(針對Wi...

    馬永翠 評論0 收藏0
  • [] Laravel 5 之美 - 4) 設置 OS X 或者 Linux 開發機器

    摘要:和使用作為包管理器,使用。除了以外,沒有官方的包管理器,但是非官方的包管理器。檢查版本要求版本是或更高版本。下載頁面安裝完畢后,一定要檢查版本,確保和在終端可用檢查和版本安裝是快速開發的一個不可或缺的部分。 原文地址: Laravel 5 Beauty - Setting up an OS X or Linux Machine 讓你的 OS X 或者 Linux 機器做好開發 Lara...

    ad6623 評論0 收藏0
  • PHP / Laravel API 開發推薦閱讀清單

    showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區優秀文章 Laravel 5.5+passport 放棄 dingo 開發 API 實戰,讓 API 開發更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項目中使用 - API 文檔撰寫方案 推薦 Laravel API 項目必須使用的 8 個...

    shmily 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<