Тестирование — это то, что отличает хороший код от «только что работает». В мире мобильной разработки, где каждая ошибка может испортить пользовательский опыт, тестирование становится особенно важным. Оно позволяет находить баги ещё до того, как приложение попадёт в руки пользователя, и экономит нервы вашей команды (и, конечно, ваших пользователей).

Сегодня мы разберём:

  • Почему важно тестировать.
  • Разницу между юнит-тестами, интеграционным и end-to-end тестированием.
  • Практическую реализацию: напишем юнит-тесты с помощью Jest и end-to-end тесты с Detox.

Почему важно тестировать?

Вы можете написать идеальный код, но всё равно остаётся риск, что:

  • Что-то пойдёт не так при добавлении нового функционала.
  • Пользователь кликнет на то, о чём вы не подумали.
  • Ваше приложение развалится на устройствах с другими версиями ОС.

Тестирование помогает:

  • Гарантировать стабильность: Вы можете быть уверены, что изменения не ломают существующий функционал.
  • Экономить время: Найти баг на этапе разработки дешевле, чем после релиза.
  • Повышать доверие: Как к продукту, так и внутри команды.

Типы тестирования

Юнит-тесты

Юнит-тесты проверяют работу отдельных «кусочков» вашего приложения: функций, компонентов, редюсеров. Они быстро выполняются и легко пишутся.

Когда использовать?

  • Проверка работы функций и компонентов.
  • Убедиться, что компоненты рендерятся корректно.

Интеграционные тесты

Интеграционные тесты проверяют, как взаимодействуют разные части приложения. Например, тестирует взаимодействие между компонентом и API.

Когда использовать?

  • Проверка взаимодействия компонентов с сервером.
  • Тестирование пользовательских сценариев.

End-to-End тесты (E2E)

End-to-End тесты проверяют всё приложение, имитируя действия пользователя. Это более сложный, но очень мощный подход.

Когда использовать?

  • Убедиться, что приложение работает как задумано, от открытия до выполнения задачи.
  • Тестирование полного пути: от ввода данных до получения результата.

Jest: для юнит-тестов

Jest — это инструмент для тестирования JavaScript-кода. Он интегрирован в React Native по умолчанию и поддерживает тестирование компонентов и функций.

Настройка Jest

Если вы используете React Native CLI, Jest уже включён. Для Expo добавьте Jest:

expo install jest react-test-renderer

Создайте файл jest.config.js:

module.exports = {
  preset: 'react-native',
  setupFilesAfterEnv: ['@testing-library/jest-native/extend-expect'],
};

Компонент для тестирования

Создадим компонент Counter.js:

import React, { useState } from 'react';
import { View, Text, Button, StyleSheet } from 'react-native';

const Counter = () => {
  const [count, setCount] = useState(0);

  return (
    <View style={styles.container}>
      <Text testID="counterText">Счётчик: {count}</Text>
      <Button title="Увеличить" onPress={() => setCount(count + 1)} />
      <Button title="Уменьшить" onPress={() => setCount(count - 1)} />
    </View>
  );
};

const styles = StyleSheet.create({
  container: { padding: 20, alignItems: 'center' },
});

export default Counter;

Тестирование компонента

Создайте файл Counter.test.js:

import React from 'react';
import { render, fireEvent } from '@testing-library/react-native';
import Counter from './Counter';

describe('Counter Component', () => {
  it('должен отображать начальное значение 0', () => {
    const { getByTestId } = render(<Counter />);
    expect(getByTestId('counterText').props.children).toContain('Счётчик: 0');
  });

  it('увеличивает счётчик при нажатии на кнопку', () => {
    const { getByTestId, getByText } = render(<Counter />);
    const incrementButton = getByText('Увеличить');
    fireEvent.press(incrementButton);
    expect(getByTestId('counterText').props.children).toContain('Счётчик: 1');
  });

  it('уменьшает счётчик при нажатии на кнопку', () => {
    const { getByTestId, getByText } = render(<Counter />);
    const decrementButton = getByText('Уменьшить');
    fireEvent.press(decrementButton);
    expect(getByTestId('counterText').props.children).toContain('Счётчик: -1');
  });
});

Как запустить?

В терминале выполните:

npm test

Вы увидите, что все тесты проходят.

Detox: для End-to-End тестов

Detox — это инструмент для автоматизированного тестирования вашего приложения. Он имитирует действия пользователя: открытие приложения, нажатия, ввод текста.

Установка Detox

Установите Detox и его зависимости:

npm install -g detox-cli
npm install detox

Настройка Detox

Добавьте конфигурацию Detox в package.json:

"detox": {
  "configurations": {
    "android": {
      "type": "android.emulator",
      "device": {
        "avdName": "Pixel_3_API_30"
      },
      "build": "cd android && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug",
      "binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk"
    }
  }
}

Для iOS используйте ios.simulator.

E2E тесты

Создайте папку e2e и файл firstTest.e2e.js:

describe('Пример теста Detox', () => {
  beforeAll(async () => {
    await device.launchApp(); // Запускаем приложение
  });

  it('должен отображать начальное значение 0', async () => {
    await expect(element(by.text('Счётчик: 0'))).toBeVisible();
  });

  it('увеличивает счётчик при нажатии', async () => {
    await element(by.text('Увеличить')).tap();
    await expect(element(by.text('Счётчик: 1'))).toBeVisible();
  });

  it('уменьшает счётчик при нажатии', async () => {
    await element(by.text('Уменьшить')).tap();
    await expect(element(by.text('Счётчик: 0'))).toBeVisible();
  });
});

Запуск Detox

Соберите приложение:

detox build -c android

Запустите тесты:

detox test -c android
 

Комментарии

0

Без регистрации и смс