はじめに
detox
に関する連続投稿になります。
前回の冪等性云々の話とは少し逆の内容なります。
メンテナンス性を考慮し、テストファイルを細かく分けることは実運用では起こり得ます。
その際、前のテストの状態を引き継いで検証したいケースもあるかと思います。
e2e
テストでは、ユーザの流れを意識し、前の状態が必要な場合が出てきます。
状態を引き継げないとなると、すべてのテストで同様の処理を走らせることとなり、処理時間やメンテナンス性が非常に悪くなると考えられます。
detox
でこれを実現する際に嵌った部分について備忘も兼ねて記事にしました。
処理の直列化について
Jest
には--runInBand
オプションがあり、それを用いることでテストを直列化することができます。
Run all tests serially in the current process, rather than creating a worker pool of child processes that run tests. This can be useful for debugging.
テストランナーにJest
を採用できるdetox
はというと、公式ドキュメントに以下のように書いてました。
NOTE: jest tests will run in band, as Detox does not currently supports parallelization.
つまりdetox
はデフォルトで--runInBand
として処理されるようです。
次に、ファイルを分割した際の処理順です。
GitHub の issue には、「ファイル名を順番にしておくことでその名前順に処理されるよ」と書かれていました。
それを信じて試してみると………、あれ?ファイル名順に処理されない……?
何度か試してみたしたがどうもダメでした。
Jest
側の issue を見ると、処理順は保証すべきではないというコメントも発見しました。
テストを名前順に処理する
前述の通り、テストを記載したファイル名を規則的に並べてもテストは名前順に処理してくれませんでした。
これでは、前の状態を再利用してテスト(ログインのテスト→ログイン後の画面のテスト、など)をおこなうのが困難です。
色々と試行錯誤する中で、とある GitHub の issue を発見しました。
それは、各テストを個別のファイルとして定義し、テストスイートとして各テストを順序別に呼び出して実行する、という方法でした。
StackOverflow の記事によると describe
のブロックは、次の describe
の処理をブロックするというものでした。
これを信じて実装してみたところ、ちゃんと直列・呼び出し順に処理がされていることが確認できました。
最終的なテストスイートは下記のような内容になりました。
import { testA } from './../scenarios/01_testa';
import { testB } from './../scenarios/02_testb';
import { testC } from './../scenarios/03_testc';
describe('test A', testA);
describe('test B', testB);
describe('test C', testC);
個々のテストは下記のような形で定義します。
export const testA = () => {
beforeEach(async () => {
// something...
});
it('can access', async () => {
// something...
});
};
おわりに
色々と試行錯誤したり、公式 issue で「この方法でできるよ」って言われている方法ではできなかったりで苦労しました。
この方法だとテストスイートが肥大化していきますが、とりあえず現時点でやりたいことは実現できました。
もっと良い方法をご存知であればご教示いただけると嬉しいです。