Какова цель написания тестов?

Я никогда не писал тесты и не понимаю, для чего они нужны. Я слышал, что тесты помогают проверить правильность работы кода и его соответствие документации, но в чем тогда заключается проблема проверки без тестирования? Возможно, я не совсем понимаю, как работают эти тесты. Можете привести наглядный пример, чтобы объяснить это для новичка? <br/> <br/> Вот пример теста, который я нашел в интернете: <br/> <pre><code class="javascript">describe('React Portal', () =&gt; {
  it('Должен отображать предоставленный контент в существующей ноде', async () =&gt; {
    const containerId = 'container-id';
    
    render(
      &lt;&gt;
        &lt;div id={containerId} data-testid='some-test-id'&gt;&lt;/div&gt;
        &lt;Portal id={containerId}&gt;
          some text
        &lt;/Portal&gt;
      &lt;/&gt;
    );

    const container = screen.getByTestId('some-test-id');
    expect(container).toContainHTML('some text');
  });
  it('Должен прокидывать ошибку, если не существует контейнера для рендеринга портала', async () =&gt; {
    const containerId = 'container-id';

    expect(() =&gt; render(
      &lt;Portal id={containerId}&gt;
        some text
      &lt;/Portal&gt;
    ))
    .toThrow(PORTAL_ERROR_MSG);
  }); 
});</code></pre>
  • 21 октября 2024 г. 11:03
Ответы на вопрос 3
Цель написания тестов заключается в обеспечении надежности, стабильности и качества программного обеспечения. Вот несколько ключевых преимуществ тестирования, а затем рассмотрим приведенный вами пример.

### Зачем писать тесты:

1. **Проверка правильности**: Тесты позволяют убедиться, что код работает так, как задумано. Если у вас есть тесты, которые проверяют функциональность вашего приложения, вы можете быть уверены в его работоспособности.

2. **Обнаружение ошибок**: Тесты помогают выявлять ошибки на ранних этапах разработки. Это значительно упрощает процесс отладки и снижает стоимость исправления ошибок.

3. **Документация**: Тесты могут служить формой документации для вашего кода, показывая, как он должен работать при различных условиях.

4. **Упрощение изменений**: Когда вы вносите изменения в код, тесты позволяют понять, не сломали ли вы что-то другое. Если тесты проходят, вы можете быть более уверены в том, что изменения не вызвали побочных эффектов.

5. **Поддержка рефакторинга**: Тесты дают уверенность в том, что вы можете улучшать код (рефакторить), не опасаясь, что он перестанет работать.

### Наглядный пример:

Рассмотрим пример теста, который вы предоставили. Этот тест проверяет компонент `Portal`, вероятно, из библиотеки React.

```javascript
describe('React Portal', () => {
  it('Должен отображать предоставленный контент в существующей ноде', async () => {
    const containerId = 'container-id';
    
    render(
      <>
        <div id={containerId} data-testid='some-test-id'></div>
        <Portal id={containerId}>
          some text
        </Portal>
      </>
    );

    const container = screen.getByTestId('some-test-id');
    expect(container).toContainHTML('some text');
  });
  
  it('Должен прокидывать ошибку, если не существует контейнера для рендеринга портала', async () => {
    const containerId = 'container-id';

    expect(() => render(
      <Portal id={containerId}>
        some text
      </Portal>
    )).toThrow(PORTAL_ERROR_MSG);
  }); 
});
```

### Разбор тестов:

1. **Первый тест**:
   - Проверяет, что текст "some text" отображается внутри существующего контейнера. Здесь `render` используется для рендеринга компонента, и тест проверяет, что содержимое действительно попадает в данный контейнер. Если что-то пойдет не так, тест не пройдет, и вы получите уведомление о проблеме.

2. **Второй тест**:
   - Убедитесь, что если вы попытаетесь отрендерить компонент `Portal`, не предоставив контейнер, будет выброшено соответствующее исключение с сообщением об ошибке. Это защищает приложение от неправильного использования компонента.

### Заключение:

Ваша первоначальная идея о том, что тесты помогают проверить правильность работы кода, верна, но их ценность выходит далеко за рамки этого. Тесты помогают нам быть уверенными в качестве нашего кода, они предотвращают появление новых ошибок и упрощают поддержку и развитие проекта. Это особенно важно в больших проектах с множеством разработчиков, когда сложно отследить изменения и их влияние на существующий код.
Тесты пишут, чтобы при изменениях в коде их прогонять и проверять, что определённое в тестах поведение не ломается. Да, можно каждый раз всё вручную прогонять, но вот для примера, у нас в проекте тысячи две автотестов, каждый раз всё это вручную прогонять ни у кого возможности нет
А в чем проблема проверить тогда без этого теста?

Проверить - это уже тест. И ты имеешь ввиду ручной, а спрашиваешь "зачем пишут". Т.е. суть вопроса: "зачем пишут автотесты".
Так вот, приближённая аналогия этого вопроса - "в чём проблема дойти из Москвы до Магадана пешком, зачем автомобили и самолёты?"

Количество тестируемых точек может достигать нескольких тысяч, а то и десятков тысяч. Чтобы проверить их вручную нужно задействовать армию тестировшиков (которым нужно платить з/п, на сек) и массу человеко-часов.

Итого : автотесты снижают стоимость и сокращают время.
Похожие вопросы