Как узнать, что Detox проводит тесты?

Я использую Detox для запуска сквозных тестов в своем проекте React Native. Я также использую pretender.js для макетирования моих запросов API и пытаюсь найти способ узнать, находится ли приложение в данный момент в режиме "тестирования".

Я передавал переменную env вниз (и используя babel-transform-inline-environment-variables), чтобы сказать, если я должен высмеивать запросы, но это ломает shim.js в наших выпусках.

Есть ли способ сказать, что Detox запустил приложение и выполняет тесты изнутри JS? В идеале я ищу какой-то набор переменных во время теста или что-то переданное из командной строки (TESTING=true react-native start или же __TESTING__)

4 ответа

Решение

Попробуйте использовать response-native-config. Здесь также есть хорошая статья об управлении конфигурацией в React Native с помощью response-native-config.

Я также дал здесь ответ /questions/34033091/animirovannyie-knopki-blokiruyut-detoks с рабочим примером того, как response-native-config можно использовать для отключения зацикливания анимаций во время тестирования.

Основная идея заключается в том, что вы создаете файлы конфигурации.env для всех ваших различных сред сборки (разработка, производство, тестирование и т. Д.). Они содержат переменные конфигурации, к которым вы можете получить доступ из Javascript, Objective-C/Swift или Java.

Затем вы указываете, какой конфигурационный файл.env использовать при создании приложения:

$ ENVFILE=.env.staging react-native run-ios # bash

И это пример файла package.json, где detox использует файлы конфигурации.env для сборки приложения.

"detox": {
  "specs": "e2e",
  "configurations": {
    "ios.sim.release": {
      "binaryPath": "ios/build/Build/Products/Release-iphonesimulator/example.app",
      "build": "ENVFILE=.env.production export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -project ios/example.xcodeproj -scheme example -configuration Release -sdk iphonesimulator -derivedDataPath ios/build",
      "type": "ios.simulator",
      "name": "iPhone 5s, iOS 10.3"
    },
    "ios.sim.test": {
      "binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/example.app",
      "build": "ENVFILE=.env.testing xcodebuild -project ios/example.xcodeproj -scheme example -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build -arch x86_64",
      "type": "ios.simulator",
      "name": "iPhone 5s, iOS 10.3"
    }
  }
}

Мы используем тот факт, что детокс вызывает ваш двоичный файл с --args -detoxServer ... -detoxSessionId ... в командной строке iOS и { detoxServer: ..., detoxSessionId: ... } установить в InstrumentationRegistry в Android.

То, как мы сейчас представляем это в JS, немного похоже на ответ Stackru, но вот пример кода, который вместе с документами о реагировании должен помочь вам - для Android:

// This will throw ClassNotFoundException if not running under any test,
// but it still might not be running under Detox
Class<?> instrumentationRegistry = Class.forName("android.support.test.InstrumentationRegistry");
Method getArguments = instrumentationRegistry.getMethod("getArguments");
Bundle argumentsBundle = (Bundle) getArguments.invoke(null);

// Say you're in your BaseJavaModule.getConstants() implementation:
return Collections.<String, Object>singletonMap("isDetox", null != argumentsBundle.getString("detoxServer"));

А на iOS что-то вроде (не имеет компилятора Objective-C ATM):

return @{@"isDetox": [[[NSProcessInfo processInfo] arguments] containsObject: @"-detoxServer"]}

Обратите внимание, что также можно получить детокс, чтобы добавить свои собственные аргументы:

detox.init(config, { launchApp: false });
device.launchApp({ newInstance: true, launchArgs: {
  myCustomArg: value,
  ...,
} });

Было бы здорово в какой-то момент довести это до модуля.

Тесты / производственный код, который имеет знания об окружающей среде, является беспорядочным IMO.
Я рекомендую делать это, создавая другой вариант приложения для тестирования.

Если вы используете React Native, ознакомьтесь с инструкциями response-native-repackager. Кроме того, в Detox docs есть и этот раздел. Если вы пишете код Java для Android, используйте варианты сборки gradle для создания вариантов тестирования.

Вы можете узнать больше о том, как мы издеваемся в наших E2E-пакетах, здесь.

React-native-is-detox работает как шарм!

Монтаж

      yarn add react-native-is-detox

Использование (асинхронное)

      import { isDetox } from 'react-native-is-detox';

// ...

const result = await isDetox();

console.log('Was app launched by Detox?', result);

.

      import { isDetox } from 'react-native-is-detox';

function App() {
  useEffect(() => {
    isDetox().then((result) => {
      console.log('Was app launched by Detox?', result);
    });
  }, []);

  return <MyApp />;
}

Использование (синхронизация)

      import { isDetoxSync } from 'react-native-is-detox';

const result = isDetoxSync();

console.log('Was app launched by Detox?', result);

.

      import { isDetoxSync } from 'react-native-is-detox';

function App() {
  useEffect(() => {
    const result = isDetoxSync();
    console.log('Was app launched by Detox?', result);
  }, []);

  return <MyApp />;
}

Мок-модуль в Jest Импортируйте response-native-is-detox/jestSetup в свой установочный файл Jest.

      import 'react-native-is-detox/jestSetup';

Спасибо user6886817

Ссылка: Раздел комментариев.

Другие вопросы по тегам