個人開発WebアプリでもE2Eテストを簡単に導入する(T-DASH)

# はじめに
この記事は[T-DASHを使ってみた！【PR】T-DASH](https://qiita.com/advent-calendar/2021/tdash)の11日目の記事です．

個人開発だとテストをしっかりと書いていくのはモチベーションが上がらなかったり，ブラウザを意識したコードを書くのがめんどくさかったりと難しいと思います．少なくとも僕はE2Eテストは全くできていませんでした．
この記事ではWebアプリにおいてブラウザを使用するユーザーの動作に対して思ったとおりの機能を提供できているかを確認するE2Eテストを[T-DASH](https://www.t-dash.io/)を使用して作成・実行します．

## 作るもの
以下のようにE2Eテストを実行できるように設定をします．
![スクリーンショット 2021-12-05 183542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/63d6a11b-bfae-ddb6-a7da-a28e55dbef4b.png)
![スクリーンショット 2021-12-05 183553.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/6c5093e1-b7ef-4d50-291a-b631839b64ae.png)


## T-DASHとは
アドベントカレンダーの説明から引用すると
>T-DASHはテストのバルテスがこの秋リリース(OPENβ版)したテスト自動化ツール です。
だれでも簡単に日本語のテストケースでテスト自動化できるを合言葉に開発されたツールになっています。

2021年12月現在はOpenβ版が無料で公開されており，全機能が無料で使用できています．また，現在はWindows版アプリしか提供されていませんが，本リリース後はMacOSにも対応していくようです．

コードを書かずにテストケースを作成し，実行・ダッシュボードへ結果をまとめる機能などが搭載されています．


# 本題
[T-DASH](https://www.t-dash.io/)を使用してE2Eテストを作成していきます．

## 準備
まずはT-DASHのアカウントとライセンスキーを入手し，T-DASHアプリを起動させる必要があります．
「T-DASHを使ってみた！【PR】T-DASH」 1日目の記事で[@84zume](https://qiita.com/84zume)さんがopenβの申込みから起動までのやりかたを詳しく解説されているので，こちらを御覧ください．

https://qiita.com/84zume/items/5051531c1d82139b4267

今回は自作ブログのE2Eテストを作成していきます．
https://mesimasi.com/

frontendとserver-sideでリポジトリが別れており，以下の２つになります．

https://github.com/masibw/blog-front

https://github.com/masibw/blog-server

多くの場合，本番環境に対してそのままテストを実行するのは良くないと思います．（金銭的な問題・テスト結果が本番環境に反映されてしまうから...など）
今回はlocalhostに自作ブログを構築して，それに対してテストを行います．

## テストケースを作成する

以下の内容をテストします．

- 閲覧者の行動に対するテスト


  - トップページにアクセスしたら記事一覧が表示されること


  - トップページから記事をクリックしたら記事詳細ページに移動し，表示されること


  - 存在しないurlにアクセスしたら404ページが表示されること


- 管理者(自分)の行動に対するテスト


    - 管理者用ページに正しいメアドとパスワードでログインできること


    - 管理者用ページの不正なメアドとパスワーろでログインを試みても失敗すること


    - 管理者用ページから新規記事を作成できること
  

### プロジェクトを作成する
T-DASHトップページの「プロジェクトを作成」ボタンから新規プロジェクトを作成します．

![スクリーンショット 2021-12-05 132231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/e504844f-7115-ee3e-6a0e-d60b3cba8b2c.png)

今回はキーに「blog」プロジェクト名称に「ブログ」と入力し，作成します．
![スクリーンショット 2021-12-05 133127.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/167eed9c-c3cd-c9b6-2249-d81977b08b62.png)

プロジェクト一覧に追加されました．
![スクリーンショット 2021-12-05 133459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/e404e292-5da7-e6ed-0f49-1bc9b80baa82.png)

### テストシナリオを作成する
作成したブログプロジェクトを開き，メニューからテストシナリオを選びます．
![スクリーンショット 2021-12-05 134403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/46635d21-545e-c4bc-6a1f-45d9501b7914.png)

「テストシナリオを作成する」ボタンを押すとテストシナリオ名が入力できるようになるので，すべて入力すると以下のようになりました．
![スクリーンショット 2021-12-05 134640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/0aa55b37-1083-259e-c7d5-897522b0ff98.png)

各項目名をクリックすることで，具体的にそのテストでの操作を設定する画面へ移動できます．
![スクリーンショット 2021-12-05 135516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/76cad928-0b28-ec38-706e-4e60aacccfc4.png)

「トップページにアクセスしたら記事一覧が表示されること」をテストするために
1. トップページのURLをブラウザで開く
2. 画面に要素が表示されるまで待つ
3. 「最新記事」というh1要素が表示されている
4. 記事が表示されている
の４つを動作セットとして登録します．

![スクリーンショット 2021-12-05 164128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/df1c0db4-597a-87fc-9121-4c46f75c6938.png)


画面名と要素名が必要な動作があるので，登録します．

### 画面定義をする
一旦保存し，メニューから画面定義へ移動します．
![スクリーンショット 2021-12-05 140816.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/e89bda0f-461f-474b-9c0e-67c52888a78c.png)

右上から「トップページ」を追加します．（右のディスプレイボタンを押すと追加できます）
![スクリーンショット 2021-12-05 150001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/adc9bea6-ddb3-618d-51d3-d707adc09a44.png)

画面一覧にトップページが追加されたのでクリックします．
![スクリーンショット 2021-12-05 150043.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/ddd50145-cfac-61ef-643d-a4992a4efeaf.png)

該当ページのURLを入力し，「画面キャプチャ」ボタンをクリックすると，新しくキャプチャ用のwindowが開きます．
![スクリーンショット 2021-12-05 150705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/bbbef4bf-0dc8-d7b3-e927-21a9085e99b6.png)
![スクリーンショット 2021-12-05 155828.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/11831bc5-de35-4cc2-72b2-eefd2499d7b0.png)

まずは右下の「要素名を入力」とあるテキストフィールドに，自分がテストケースを書くときに使用したい名前で入力します．今回は「ヘッダ」と入力します．そして追加された行の値列をクリックし，選択します．

![スクリーンショット 2021-12-05 160145.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/5a1121f8-ee83-1658-7a3d-18d7d49645d7.png)
この状態で「トラッキング」->「テストケースで使いたい要素をクリックで選択」->「パス取得実行」->「パスチェック」を行うことで，要素名と実際の要素を紐付けることができます．
![スクリーンショット 2021-12-05 160417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/5e2a398a-6f94-a387-3d34-67f2cbee7daa.png)
うまくいくと，このようにパスチェックに「OK」と表示されます．
![スクリーンショット 2021-12-05 160505.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/8683fe8b-e5b1-a637-8888-957e5568c08c.png)

後は同様に使用したい要素を要素名と紐付けていきます．それが終わったら，再度テストシナリオ記載ページに戻ります．登録した画面・要素を設定し，最終的に以下のようになりました．
![スクリーンショット 2021-12-05 164031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/02717c81-c5c6-3652-e079-0a986e48c385.png)


### 実行してみる

この段階で試しに実行してみます．先ほど作成した「トップページにアクセスしたら記事一覧が表示されること」というテストシナリオのみチェックをつけて右上の「選択したテストを実行する」ボタンを押します．
![スクリーンショット 2021-12-05 162225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/db2a3b29-00de-ad9d-116d-f04c9ea23184.png)

![スクリーンショット 2021-12-05 162313.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/1ad1efbf-dc7a-c7f9-d644-a1d0f32911d9.png)

テストが完了すると，ダッシュボード画面で様々な情報を見られるようになっています．

![スクリーンショット 2021-12-05 163118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/fc9acaa4-2f27-59f8-fa31-b7df26526ff3.png)

### 残りのテストシナリオを作成する

- 閲覧者の行動に対するテスト


  - ~~トップページにアクセスしたら記事一覧が表示されること~~（済）


  - トップページから記事をクリックしたら記事詳細ページに移動し，表示されること


  - 存在しないurlにアクセスしたら404ページが表示されること


- 管理者(自分)の行動に対するテスト


    - 管理者用ページに正しいメアドとパスワードでログインできること


    - 管理者用ページの不正なメアドとパスワーろでログインを試みても失敗すること


    - 管理者用ページから新規記事を作成できること

残りのテストシナリオを作成したのがこちらになります（お料理番組感）

![スクリーンショット 2021-12-05 180442.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/a707da82-4185-1eb6-3b15-a4af1d8517fb.png)


テストシナリオと画面定義をエクスポートしたものを 以下のGoogle Driveへ配置しておきますので，参考にしてみてください．動かすのは僕のブログシステムをlocalhostへ準備するのが大変だと思います...

https://drive.google.com/drive/folders/1hRYZg_NpIQK70pCbiaD0FOHyGdrjMdCU?usp=sharing

<details><summary>インポートの仕方</summary><div>

テストケースのインポートを押します．
![スクリーンショット 2021-12-05 182222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/70adeedc-acbe-4c3c-4733-2ad2cc954ea0.png)

ダウンロードしたファイルを選択し，赤枠で囲った列を順に選択します．
後はインポートボタンを押せば終了です．テストシナリオごとにexcelのシートが分けられているので，１つずつシートを選択してインポートする必要がありそうです．（一気にインポートしたい...)
![スクリーンショット 2021-12-05 181652.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/04caf574-b9d6-81b0-c426-3dc670256e3b.png)

画面定義は，「画面をインポート」を押して

![スクリーンショット 2021-12-05 182445.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/0fe5ac25-c3a0-3987-1d76-87ad0dc05ab2.png)

ダウンロードした.robotファイルをすべて選択します．
![スクリーンショット 2021-12-05 182546.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/3f565de3-112b-6ab7-dbe3-652d90b26273.png)

後は実行すればインポートされます．
![スクリーンショット 2021-12-05 182623.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/54ecaf52-72ff-1422-918c-ede882677749.png)

</div></details>

### 動作セット
- 管理者用ページから新規記事を作成できること

というのは管理者用ページにログインできている前提があります．
ということは

- 管理者用ページに正しいメアドとパスワードでログインできること

で行う操作を再度記載する必要があります．同じ内容を記載するのは不便ですし，メンテナンス性も悪いです．
T-DASHには「動作セット」という機能があり，いくつかの動作を１つの動作として再定義することができます．

１つにまとめたい動作をドラッグで選択した後に「動作セットを作成」ボタンを押します．
![スクリーンショット 2021-12-05 173009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/6f5e8245-3b76-1fa4-079e-d13de39cf6f3.png)

動作セット名を設定し，「作成」ボタンを押します．
![スクリーンショット 2021-12-05 173100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/46d9cd46-35e3-4e32-a003-fbbad8542636.png)

１つの動作としてまとめられました．
![スクリーンショット 2021-12-05 173413.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/a5379e23-6ab5-ea33-b4a4-b9f74c091dd8.png)


# さいごに
今回，自作ブログのE2Eテストを実際に作成してみましたが思っていた以上に簡単でした．かなり直感的にテストシナリオを作成できますし，作成するスピードも早かったです．（今回のテストシナリオは１時間ちょっとくらいで作成できています）個人開発においても気軽にテストで品質を担保できるのはとても嬉しいですね．是非皆さんも使ってみてください．

## 欲しい機能
あればもっと良いのにな～～という機能をいくつか挙げさせていただきます．
### CLIから実行する機能
現在はテストケースの実行もGUIから行う必要がありますが，Github ActionsやCircle CIなどのCIでの実行をサポートする機能があるとかなり便利だと思います．現在でもpuppeteerやseleniumなどでWebブラウザ操作を自動化すればテスト実行ボタンを押すくらいはできそうな気はしますが...

### テストシナリオの複製
一部だけ内容が違うテストを作成するために，存在するテストを複製できると便利だなと思います．（動作セットがその役目を果たしている面もありますが，任意の入力を渡せるわけではないので若干不便）

### 既にある動作の上書き
テストシナリオを書いているときに既に存在する動作を選んだ状態で，別の動作ボタンを押してしまうとなんの警告もなしに上書きされてしまいます．戻るボタンも（おそらく）存在しないので，少し不便ですね...

### ステータスコード用いた検証
そのページが存在しないかどうかはページの要素を用いるよりステータスコードの検証をしたほうが楽な気がするので，「404かどうか」みたいな動作があると嬉しいですね

### teardown, cleanupに相当する機能
テストが成功しても失敗しても実行する機能が欲しいです．テスト中に作成したものを削除するのに必要な気がしますね...

### すべてをエクスポート・インポートする機能
テストシナリオ毎・画面定義ごとではなく丸ごとエクスポート・インポートできると楽だなと思います．

### 画面定義エクスポートについての説明
画面定義をどこからエクスポートするのかについての記述を見つけられませんでした．結局トップページの「プロジェクト保存先」に表示されているディレクトリを直接開き，中からファイルを探してきましたが正攻法じゃない感が強いです..

![スクリーンショット 2021-12-05 182839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/13fe4434-6f57-3c3c-6c1c-928392d04c2a.png)