LoginSignup
3
1

More than 5 years have passed since last update.

detox でテストを直列に実行する

Last updated at Posted at 2019-03-14

はじめに

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 で「この方法でできるよ」って言われている方法ではできなかったりで苦労しました。
この方法だとテストスイートが肥大化していきますが、とりあえず現時点でやりたいことは実現できました。

もっと良い方法をご存知であればご教示いただけると嬉しいです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1