「初めての自動テスト」を読んだメモ

第Ⅰ部:基礎

ユニットテスト

🙆 メリット

  • 超高速
  • 多目的に利用できる

🙅 デメリット

  • 統合部分の確認に弱い
    • 全体がつながっているか、は統合テストで確認

統合テスト

🙆 メリット

  • WebサービスAPIのテスト
  • つながりを見る
    • 複数の機能がつながって実現されている機能もテストできる

🙅 デメリット

  • 詳細さに欠ける
    • 「何か」が壊れていることはわかっても、「どこ」が壊れているかわからない

UIテスト

🙆 メリット

  • エンドツーエンドで動く
    • システムの内部構造に立ち入らず、システムの外から全体をテストする
  • ユーザと同じ対象を見る

🙅 デメリット

  • 高コストで遅い
    • HTMLの要素が変わったりすると壊れてしまう

親指の法則

  1. UIよりもユニットを優先する
  2. ユニットテストでうめられないことを統合テストでカバーする
  3. UIテストは限定的に行う

そのほか

  • JSもテストがかける
  • REST
  • Ajax

第Ⅱ部

なんとなくつかっていたファサードについて少し調べた

普段業務のなかでなんとなく理解していることが多いなと感じたので、 自分のメモとしてなんとなく理解していることをちょこちょこ書いていきます。

ファサードとは

フレームワークの機能を簡単に利用できるもの

例)Config の例

  1. Config::get('app.debug') がコールされる
  2. Configの実体である Illuminate\Support\Facades\Config クラスの getメソッド を呼び出す(config/app.phpaliases にクラス名が定義されている) 

  3. Illuminate\Support\Facades\Config クラス には getメソッド がないため、スーパークラス__callStatic メソッドを呼び出す(スーパークラス = 継承元のクラス:Illuminate/Support/Facades/Facade

  4. __callStatic メソッドでは、getFacadeRoot メソッドで操作対象のインスタンスを取得し、getメソッドを実行する

    /**
    * $method: 実行メソッド名(get)
    * $args: 実行されたメソッドの引数を格納した配列(['app.debug'])
    **/
    public static function __callStatic($method, $args)
    {
        $instance = static::getFacadeRoot(); // ①
    
        if (! $instance) {
            throw new RuntimeException('A facade root has not been set.');
        }
    
        return $instance->$method(...$args); // ②
    }

 ① ファサードが受け持つインスタンスをサービスコンテナから取得

 ② $methodの名前でインスタンスメソッドを実行

Laravel5.* で FORM, HTMLファサードをつかうには

  1. パッケージをインストール
    $ composer require laravelcollective/html

インストールすると、composer.jsonlaravelcollective/html が追加される github.com 2. config.appproviders に追記する

    'providers' => [
        // ...
        Collective\Html\HtmlServiceProvider::class,
        // ...
      ],
  1. config.appaliases にクラス名を定義する
    'aliases' => [
      // ...,
      'Form' => Collective\Html\FormFacade::class,
      'Html' => Collective\Html\HtmlFacade::class,
      // ...,
    ],

MacでSeleniumを動かしてみました!

Seleniumとは

Seleniumとは、Webアプリケーションの画面操作を自動化するツールです。 クリックやキー入力、画面に表示された値の取得や画面キャプチャの取得など、ブラウザに対するさまざまな操作を自動で行うことができます。

                      引用:Selenium 実践入門

用意するもの

今回は Mac + Ruby + Chrome で動かすための用意になります!

  • Selenium WebDriver

  • 使用するブラウザのドライバ

  • 関連ライブラリ(capybara, rspec

1. Selenium WebDriverをインストール

Selenium WebDriverとは、プログラミング言語のコードからブラウザ操作が可能なライブラリです。 JavaRubyJavascriptなど各言語のライブラリとして提供されています。

                       引用:Selenium 実践入門

わたしは今回Rubyをつかうので、gemを利用してインストールします!

$ sudo gem install selenium-webdriver

このときRubyのバージョンが古いと、うまくいかないことがあるのでご注意ください!

バージョンを新しくする方法は下記記事を参考にさせていただきました。

gabekore.org

2. 使用するブラウザのドライバをインストール

WebDriverは利用するドライバクラスを差し替えることでさまざまなブラウザ上で実行することができます。

わたしはChromeをつかいたいので、Chromedriverをインストールしました!

brew install chromedriver

Chromeのほかにも

  • FirefoxDriver

  • InternetExplorerDriver

  • SafariDriver

などあり、それぞれセットアップ方法も違うようなので調べてみてください!

3. 関連ライブラリのインストール

capybara

Rubyスクリプトを記述するWebアプリケーションのE2Eテスト*1フレームワーク

ブラウザ操作(クリック・フォームコントロール・要素の取得など)を簡単なコマンドで行うことができるようになります!

sudo gem install capybara

Rspec

RubyでWebDriverと組み合わせて利用できるテストフレームワーク

sudo gem install rspec

以上で用意は完了となります!

いざ実行!

▼ test.rb

require 'capybara/rspec'

# seleniumでchoromeを使用する
Capybara.default_driver = :selenium
Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, :browser => :chrome)
  end

feature 'Cabybaraのサンプル' do
    scenario 'テストすること' do

        # Googleへアクセス
        visit 'https://www.google.co.jp/'
        
    end
end
$ rspec test.rb

Chromeが自動的に立ち上がり、Googleへアクセスしたら成功です!

ひとこと

Seleniumを先輩から教えていただいて、備忘録のためにもまとめようと思い書きはじめましたが書きおえるのに数日要しました・・

ブログを書くのって難しい、ほぼ引用のくせに。。

記法も調べながら書くので所要時間倍増です;;

参考にした書籍

Amazon.co.jp:Selenium実践入門:伊藤 望 (著), 戸田 広 (著), 沖田 邦夫 (著), 宮田 淳平 (著), 長谷川 淳 (著), 清水 直樹 (著), Vishal Banthia (著):本

 

*1:E2E(End to End)テスト:ユーザと同じようにブラウザを操作し、挙動が期待通りになっているか確認するテスト

ブログをはじめます!

もうすぐ新卒が終わるエンジニアです。

ブログをはじめてみることにしました!

 

目的は

・アウトプットすることで理解を深める

・学んだことを忘れないようにする

 

今までしようしようとおもってできていなかったので、

しっかり継続して発信していきたいです!