テストとリファクタリング
前項で設計したテスト結果について記す。
前項の通りテスト項目それぞれに対してテストを作成し実行した。テストの作成および実行結果を受けて修正も同時並行し行った。それぞれの項目に対し以下の内容のテストを行った。以下に示す。
テスト
モデルテストおよびチャネル・コネクションテスト
モデルテスト
モデルはコントローラテスト時もコントローラの処理に起因し動作する。そのため最初にテストを作成・実行しテスト仕様に合わせた修正を加える必要があると考えた。前項のテスト設計内容と確認した動作について示す。
また、既存データとしてフィクスチャファイルにN君、Xさん、Yさんを登録している。それぞれ半角の小文字として、ユーザ名とルーム名に使用し登録している。
モデル名 | 検証内容 | 成功する場合 | 失敗する場合 |
---|---|---|---|
User | ユーザ名は唯一である。 | 新規ユーザ、SampleUser を作成 |
既存ユーザ、nkun を作成 |
User | ユーザ名はスペースなしの半角英数字のみとする。 | 同上 | !#$%&'()=-~^ |? のユーザを作成 |
User | ユーザ名は空を許可しない。 | 同上 | ユーザ名を空白で作成 |
User | ユーザ名は1文字以上、16文字未満とする。 | 同上 | 123456789abcdefg で作成 |
User | パスワードはスペースなしの半角英数字のみとする。 | SamplePass を設定 |
!#$%&'()=-~^ |? を設定 |
User | パスワードは空を許可しない。 | 同上 | 空のパスワードで作成 |
User | パスワードは1文字以上16文字未満とする。 | 同上 | 123456789abcdefg を設定 |
Room | ルーム名は唯一である。 | 新規ルームSampleRoom を作成 |
既存ルームnkun を作成 |
Room | ルーム名はスペースなしの半角英数字のみとする。 | 同上 | !#$%&'()=-~^ |? のルームを作成 |
Room | ルーム名は空を許可しない。 | 同上 | 空のルーム名で作成 |
Room | ルーム名は1文字以上、16文字未満とする。 | 同上 | 123456789abcdefg で作成 |
UserRoom | レコードに記録されたidのユーザが存在する。 | 中間テーブル経由で存在を確認(新規&既存) | 存在しないユーザレコードを挿入する |
UserRoom | レコードに記録されたidのルームが存在する。 | 同上 | 存在しないルームレコードを挿入する |
UserRoom | 空のレコードを許可しない。 | 同上 | ユーザとルームを指定せず保存 |
UserRoom | ユーザとルームの組み合わせが唯一である。 | 新規作成を行う。 | 既存レコードを再作成 |
Chat | レコードに記録されたidのユーザが存在する。 | 中間テーブル経由で存在を確認(新規作成) | 存在しないユーザレコードを挿入する |
Chat | レコードに記録されたidのルームが存在する。 | 同上 | 存在しないルームレコードを挿入する |
Chat | レコードに記録されたidのチャットテキストが存在する。 | 同上 | 存在しないチャットテキストレコードを挿入する |
Chat | 空のレコードを許可しない。 | 同上 | 何も指定せずに作成 |
ChatText | 空のテキストは保存しない。(空白文字だけ、改行だけも禁止) | <div>test text</div> で新規作成 |
禁止パターンを複数作成 |
チャネル・コネクションテスト
チャネルとコネクションもコントローラと同様にモデルに依存する。しかし、本件ではコントローラには依存しないのでそれぞれ独立して検証できる。
テスト項目は前項より以下のとおりであり、それぞれ成功する場合と失敗する場合についてそれぞれ以下のように検討した。
クラス名 | 検証内容 | 成功する場合 | 失敗する場合 |
---|---|---|---|
Connection | 認証 | クッキーに正しい情報を付与し、ユーザとルームを特定する。 | クッキーに間違った情報を付与する |
Connection | 上記より、認証失敗時はエラーを出す。 | 認証成功時は不要 | 認証失敗時に404を返す |
RoomChannel | ブロードキャスト | 認証成功状態でspeakメソッドを実行 | 認証失敗状態でspeakメソッドを実行 |
RoomChannel | データベースに登録 | 認証成功時は追加できる | 認証失敗時は追加できない。 |
RoomChannel | レンダリングは指定のテンプレートで描画されているか? | テスト側のレンダリングと比較 | 失敗時は検証不可 |
コントローラのテスト(機能テスト)
コントローラのテストは基本的に指定URLにアクセスできるかの確認をする。そのためテーティングの通りアクセスできるかをテストで検証する(できなければエラーであるため修正する)。また失敗を検証するパターンはユーザの新規作や認証に関するものである。そのため認証に関するもので検証した項目について以下に示す。
コントローラ | 検証内容 | 成功する場合 | 失敗する場合 |
---|---|---|---|
Auths | ログイン | nkun としてログインする |
DBに存在しないnkun_janaiyo でログインする |
Auths | ログアウト | WT5CZXGqkwLuv05D でログアウトページへ |
設定なしでログアウトページへ |
Auths | ユーザを作成 | 有効なユーザ情報で作成 | 無効なユーザ情報で作成 |
Rooms | ルーム一覧表示 | 正しい認証情報を付与 | 認証情報なし |
手動テスト
上記まででテストコードによる確認はできた。そのため前項で示した手動でのテストを実行する。
手動で試した結果、テスト項目の内容をおおよそクリアすることができた。おおよその意味は、ログアウトについて想定していない挙動をすることである。
ログアウトを実行した結果が上手く反映される場合とそうでない場合がある。調査した結果、Basic認証ではログアウトという概念がないそうだ。そのためログアウト自体が難しい。その点を考慮して今回は一部動作に難があるが問題無しとして進める。方法はあると思うので次以降のイテレーションで実現可能な場合は追加をする。
リファクタリング
これまで動くコードを優先して作成してきた。そのため一部適切でないところがある。部分的にこれまでも最適化をしてきたがここで全体を簡単に見直していく。モデルやコントローラはマージの際に不要分の削除などをしたため、ここでは主にビューの整理をする。
コードを一部修正(不要な部分の削除、説明文の追加など)をして再度テストを実行。テストが成功することを確認。
今回は時間の都合上ここまでとする。リファクタリングになっていない可能性が高いが、ある程度読みやすいコード(コメントや重複の削除など)にする工夫をしたので良しとして進める。