はじめに
E2Eテスト自動化でCypressを使った際に学んだ事を備忘録として残しておく。
Cypressとは
Index
- cy.contains()の使い方
- データ駆動テストの実現方法
- 自動テストの時にだけ起きてしまうエラーを無視する
- 〇〇されるまで待機するの実現方法
- cy.get('#hoge').then($el => {})の$elの正体
cy.contains()の使い方
DOM指定を行う際に、どうしても文字列で検索して指定したい場面も出てくる。
その際にcy.contains()
コマンドは便利だが、これはcy.get('…').contains('hoge')
のようにcy.get()
コマンドの後に用いるようにする。
理由としては以下の2つ。
- containsで文字列を検索してDOMを指定する際に、検索対象のDOM範囲を制限し、意図しない動きにならないようにするため
- getではDOMレンダリングまで暗黙的な待機処理が行われるが、containsでは暗黙的な待機処理がないため、DOMレンダリング前に動いてしまい要素が見つからないというエラーが起きやすくなる
推奨 | 非推奨 |
---|---|
cy.get('#id').contains('hoge') | cy.contains('hoge') |
データ駆動テストの実現方法
テストでは同じシナリオを異なるデータで実行したいという場面は多く、そんな時にはデータ駆動テストを実装する。
Cypressでもデータ駆動テストは実現でき、以下のように実装すればよい。
cypress
├── fixtures
│ └── hoge.json
├── integration
│ └── data-driven-test.js
const datas = require('../fixtures/hoge')
datas.forEach(data => {
before('', () => {
})
beforeEach('', () => {
})
it('', () => {
})
})
参考文献
自動テストの時にだけ起きてしまうエラーを無視する
手動テストの際には起きないが、Cypressでの自動テストではエラーが起きるという時には、以下のようにする事でそのエラーを無視する事ができる。
it('', () => {
cy.on('uncaught:exception', (error) => {
console.log(`${error.message}`);
return false;
})
})
〇〇されるまで待機するの実現方法
自動テストにおいては、ページ遷移などの際に〇〇が表示されるまで待機させたいという事が出てくる。
SeleniumではImplicitWait
を使うと思うが、Cypressではcy.should()
コマンドを用いて実現する。
cy.get('#hoge')
.should('have.text', hogehoge)
明示的にどれだけの時間を待機させるかを設定する事もでき、その場合以下のように書く。
cy.get('#hoge', { timeout: 5000 })
.should('have.text', hogehoge)
cy.get('#hoge').then($el => {})の$elの正体
以下のようにある要素にクラスが含まれている場合には、というif文を書く事もできる。
※$el:jQuery.fn.initオブジェクト
cy.get('#hoge').then($el => {
// ある状態の時には〇〇を…という事ができる
if ($el.className === 'selected') {
// 何かのテスト
}
})
その他 ナレッジの宝庫
以下にはCypressを使ってテストをする際に、「これどうやるんだろう」となった時にとても参考になるナレッジがまとまっている。