技術的な何か

Testing LibraryとJestを用いて親子コンポーネント間のイベント発火をテストする方法

UIコンポーネントからイベント発火したことをテストする 親子コンポーネントの連動をテストする際、子コンポーネントでイベント発火したことを親コンポーネントに伝えたか確認したいことがある。特に小コンポーネントで状態を加工して親コンポーネントに送る…

Storybook 8.xのStorybookファイルをTesting Libraryで使用する

UIコンポーネントのカタログツールStorybookを使い、コンポーネントをセットアップする方法もある。StorybookはStoriesというファイルに「どのようなコンポーネントをStorybookに描画するか」を記載する。propsに応じて描画内容を出し分けることもできる1。 …

Testing Libraryでrender関数を使ってUIコンポーネントをレンダリングする方法は複数ある

テストランナーを動かす前に「UIコンポーネントは今どういう状態なのか」をセットアップしなければいけない。UIコンポーネントが必須のpropsを持つ場合、propsを与えなければUIコンポーネントは動作しない。また、 特定の場面で挙動が変わる場合は特定の場面…

Testing Libraryで<td>要素に関するテストを書く場合にどうやって要素を探索するか

Testing Libraryで<td>要素に関するテストを書く場合、getAllByRoleで<td>タグを取得する方法と<tr>タグで一度対象の列を取得したのち<td>タグを取得する方法がある。 <td>タグを直接取得する方法 getAllByRoleでARIA roleのcellを指定して取得できる。<td>(テーブルセル)は複数存</td></td></td></tr></td></td>…

Testing Libraryでフォームの値を編集するときのテストを書くときに気をつけること

テキスト入力フォームの特徴は「入力値をユーザーが好きに編集できる点」である。テストケースもフォームの値を編集した後UIが変わることを確かめたい場合が多い(例:入力値に応じてバリデーションチェックを行う)。フォーム入力はDOMイベントになるためus…

Testing Libraryで<input type="text">に対するテストケースを書く

テキスト入力を行う<input type="text">1コンポーネントはWebアプリケーション開発を行う場合ほぼ必須となる。このテストケースの記載方法を覚えておくとあらゆる面で応用が効くためTODOを挙げて記載方法を確認していく。 TODO 苗字の入力フォームと名前の入力フォームが存在す…

Testing Libraryで複数の<option>を選択する<selectbox>のテストを記載する

ドロップダウンには複数の<option>を選択できるパターンが存在する。これをテストする例は探しても中々出てこないため、記載する。 複数要素は<select>にmultiple属性を設定することで実現できる。 export default function StayExtensionMultipleSelectBox() { return ( // </select></option>…

Testing Libraryで<select>と<option>を操作するテストケースを書く

クリックすると複数の選択肢が表示され、一つまたは複数を選ぶことができるUIパーツを「ドロップダウン」「プルダウン」「セレクトボックス」などと表現する。HTML選択要素とも表現される。HTMLタグは<select>1と表現する。ここではMDN日本語ドキュメントに合わせt「</select>…

Testing Libraryでラジオボタンのvalueを取得するテストを書きたい

ラジオボタンやセレクトボックスのように、valueを持つHTMLタグがある。 UIコンポーネントテストを書く際、valueが意図通り設定できていることをテストしたい場面がある。 ハマってしまいやすいのでメモする。 ラジオボタンの値を取得したい場合 こういう実…

Testing Libraryを用いてラジオボタンの選択状態をテストする

ラジオボタンやチェックボックスなど、クリックしたときchecked属性を切り替えてON・OFFを表現するUIコンポーネントがある。 これのテスト方法を毎回探し回っていたため、記録しておく。 ラジオボタンをクリックしたとき選択状態が切り替わるかテストする ラ…

UIコンポーネントテスト:ボタンクリックで要素の表示・非表示を切り替えたいとき

ボタンクリックで表示・非表示を切り替えたい UIを開発しているとボタンをクリックすると指定要素の表示・非表示を切り替えたい場面が出てくる。これをUIコンポーネントテストに落とし込む場合、少し注意が必要となる。 理由は「見た目上は消えているがレン…

getByRole()を使ったボタン要素の取得方法

Testing Libraryで<button>要素に関するテストケースを書く場合、ボタン要素の取得はgetByRole()1を使うことをおすすめする。 getByRoleを使うと「〇〇ラベルのボタン要素」に対するテストであることを一目で例示できるためである。 getByRole()は各要素に紐づくWAI-</button>…

マッチャーを使い分けながらテストを簡潔に記載する

テストランナーにはマッチャー(Matcher)1というAPIが存在する。これは、テストを実行するライブラリ(テストランナー)に「こんな検証をしてほしい」と伝えてテストを実行してもらうための関数である。マッチャーの使い方を知っていると、初めて出てくる仕…

UIコンポーネントテストでユーザーイベントを再現するときのポイント

UIコンポーネントテストでは「ボタンをクリックするとテキストが表示されることを確かめたい」など、ユーザーの操作を再現したい場面が出てくる。 ユーザー操作の種類は無限にあるように見えるが、考え方を身につけていればUIコンポーネントテストを書ける。…

UIコンポーネントテストで要素を取得する

UIコンポーネントテストで鬼門となるのは「テスト対象の要素を取得する」ことである。 要素が取得できないとそもそもテストしようがないのである。UIコンポーネントパーツはお決まりのパターンがあるので真似れば良いが、100%参考にできるわけでもない。また…

初期状態(props)を活用して仕様を表現する

ここでの初期状態とはUIコンポーネントテストを書くとき設定するpropsのことである。 propsが複数ある場合、全てのパターンを網羅しようとすると組み合わせの数次第ではテスト数が膨大になる。 すると、テストケースの維持やメンテナンスが難しくなる。 自動…

UIコンポーネントテストを書く流れ

UIコンポーネントテストをいきなり書くのは難しい。最初にテストを書く流れを抑えたあと書き始めると良い。 テスト用ライブラリの思想を理解する(最初の1回のみ) UIコンポーネントの仕様を言語化する 言語化したものを元にTODOリストを作る TODOリストを元…

なぜUIコンポーネントテストは難しいのか

UIコンポーネントテストを書く行為は後回しになりやすい。それは難しさが要因に含まれているからと考えられる。 どのような部分が難しいのだろうか。 セットアップが難しいから UIコンポーネントを動かすためにはブラウザ環境を擬似的に再現する必要がある。…

UIコンポーネントテストと単体テストの違い

UIコンポーネントテストは単体テストと似ている面もありつつ、異なる点も存在する。両者の違いを明確にすることで更に理解を深めたい。 単体テストとは 『【この1冊でよくわかる】 ソフトウェアテストの教科書 [増補改訂 第2版]』1によると、単体テストは次…

UIコンポーネントテストとは何か

普段何気なく書いているUIコンポーネントテストについてまとめた。 UIコンポーネントテストは、「UIコンポーネント」の動作を自動的にテストするプロセスである。「UIコンポーネント」について、Reactの公式ドキュメント1では以下のように説明されている。 R…

コンポーネントテストの組み立て方を整理したい

UIコンポーネントテスト、書けると複雑なコンポーネントのバグを防ぐ効果があると思っている。 しかし、慣れるまではテストケースの組み立て方法すらわからず苦戦する印象がある。 苦戦するだけならいいが、うまくいかず挫折するともったいない。組み立て方…

React Testing Libraryでrole属性が定義されていないHTMLタグを取得したい

背景 React Testing Libraryでテストを書くとき、たまに<span>や<div>などrole属性が設定されていないタグを取得したい場面がある。Testing Libraryのクエリはアクセシビリティを意識したものになっているため、<div>のようにrole属性がないタグをそのまま取得する手段は少な</div></div></span>…

特定のファイルだけにPrettierのフォーマット方法を指定したい

JSON形式の翻訳ファイルをアルファベット順にソートしたいを書いたとき、Prettierのプラグインを使う手段を調べていた。そのとき、「pluginsを使うのはいいけど、翻訳ファイルだけソートできないものか」と感じた。 Prettierの設定にConfiguration Overrides…

JSON形式の翻訳ファイルをアルファベット順にソートしたい

国際化対応のつらみポイント prettier-plugin-sort-jsonを使う 方法 所感 参考URL sort-package.jsonでソートする 方法 所感 参考URL Node.jsのAPIを使ってJavaScriptでソートする 所感 参考URL まとめ 国際化対応のつらみポイント 自分の関わっているプロダ…

ChatGPT Plusを使ってプログラミングの学習をする

9月頭に例の病1にかかってしまい、1週間程度寝込んでしまった。 2・3週間近くコーディングなどの技術的なことから離れてしまう羽目になり2、その間にすっかり何もできなくなってしまった。 これはいけないとリハビリをすることにした。以前からChatGPT Plus…

Dev Container利用時にgit commitしたとき「Waiting for your editor to close the file...」エラーが出てきたため対応した

最近Visual Studio CodeのDev Containerを使って開発している。 使い始めのときgit commitを試みたところ、「Waiting for your editor to close the file... 」と出てきて焦ったため解消法をメモしておく。 エラー内容 devcontainer.json 解消法 Vimを使いた…

Vue2.xで開発していた人がReact始めた感想:コンポーネント内のState管理

事情があって[^1]本格的にReactをやることになった。今まではVue2.xで開発していた。 慣れてしまう前に印象を書き残しておくことにする。 前提は↓の記事と同じ。 rimarimadan.hatenablog.com 所感 「State自体がわからない」ところから始めるならVue(Option…

Vue2.xで開発していた人がReact始めた感想:環境構築

事情があって1本格的にReactをやることになった。今まではVue2.xで開発していた。 慣れてしまう前に印象を書き残しておくことにする。 前提 要件的にSPAで作りたい。 初期ローディング後は高速に操作させたい ページ遷移のたびに最新のデータを取得してレン…

調べ物をするときChatGPTを使うと便利

最近仕事でReact.jsを触る機会が増えた。今まではVue.jsを書いていたため「Vueのv-ifにあたるものはReact.jsでどう書くんだろう…」のような疑問があれこれ湧いてくる。そのようなとき、話題のChatGPTを使うとはかどるなと思った。 たとえば「React.jsでProps…

初心者にTypeScriptを教え始めた感想

※ここでの初心者とはこのようなイメージです 一人で仕事をするには心許ない 基礎構文(if forなど)はできる Objectや配列の処理は心許ない 静的型付け言語は経験がない モブプログラミング形式の勉強会、参加者が自力でテストを書けるようになったため、Typ…