Понимание того, как работает тестирование программного обеспечения и что тестировать - PullRequest
19 голосов
/ 18 июня 2010

Вступление:
Я видел много тем здесь на SO о тестировании программного обеспечения и других терминах, которые я не понимаю.

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

Вопрос:
Можете ли вы помочь мне понять эту тему немного больше?

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

  • Когда я разрабатываю функцию, как мне ее протестировать? Например: при работе с функцией суммирования я должен проверять каждое возможное входное значение или только некоторые ограничения? Как насчет тестирования функций со строками в качестве параметров?
  • В большой программе я должен тестировать каждый ее фрагмент кода? Когда вы, ребята, программируете, вы тестируете каждый написанный код?
  • Как работает автоматизированный тест и как его попробовать? Как работают инструменты для автоматического тестирования и что они делают?
  • Я слышал о модульном тестировании. Могу ли я получить краткое объяснение по этому поводу?
  • Что такое среда тестирования?

Если возможно, опубликуйте код с примерами, чтобы прояснить идеи.

Любая помощь по этой теме очень приветствуется! Спасибо.

Ответы [ 6 ]

8 голосов
/ 18 июня 2010

Начнем с очевидного:

Как работает тестирование? При разработке через тестирование вы сначала думаете о функциональности, которую хотите реализовать, а затем пишете тест для нее. В приведенном вами примере функции суммы совершенно очевидно, что она должна делать. Затем вы пишете тест, который проверяет, что суммирование сработало.

Модульные тесты должны быть максимально легкими, чтобы вы могли запускать их при каждом нажатии кнопки сборки. Когда вы сделаете это сейчас, в этом примере ваш тест не пройден, потому что вы еще не реализовали функцию суммы.

Теперь вы пишете реальную функцию и продолжаете отладку и реализацию, пока тест не пройдет. Тогда вы уверены, что реализовали нужную функцию.

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

Когда должен проводиться один тест? Как я уже говорил, тест должен быть достаточно легким, чтобы его можно было запускать в каждой сборке. И да, запустите их все. Это гарантирует, что вы не пропустите зависимость в своем коде, которая разрушает вещи далеко от точки, которую вы редактировали.

Можно ли что-нибудь проверить? Ну, обычно методы, основанные на внешних ресурсах, трудно проверить. Под этим я подразумеваю базы данных, сетевые подключения или конкретное оборудование и драйверы. Это может быть сделано, но тогда вам нужно настроить тестовую установку большего размера.

Исправление ошибок и тесты Типичный сценарий, когда тестирование становится действительно полезным, - это если вы сжимаете ошибки. Не буквально конечно. Если у вас есть ошибка, которую нужно исправить, сначала попробуйте написать тест для нее. И затем исправьте свой код, пока ваш тест не пройдет. С этого момента этот тест «следит за вашим кодом», что эта ошибка больше никогда не вернется.

Что вы получаете, тестируя? На мой взгляд, есть много вещей

  1. Более модульный, более простой в обслуживании код, потому что он должен быть тестируемым
  2. Уверенность. Наличие базы кода, которая в значительной степени протестирована, дает вам уверенность в том, что она работает так, как ожидалось, и остается такой.
  3. Вы рано находите ошибки. Это означает, что вы можете легко их исправить.

Требуется некоторое усилие, чтобы привыкнуть к использованию тестов, но я думаю, что оно того стоит. Особенно, если вы пишете какие-то библиотеки.

3 голосов
/ 18 июня 2010

Ну, Обычно есть три вида тестов. Модульные тесты, системные тесты и тесты QA. Модульные тесты, как следует из названия, тестируют небольшие блоки - отдельные функции и классы.

Для всех современных сред разработки существуют платформы модульного тестирования. Есть Nunit для .net, а также инфраструктура модульных тестов MS в Visual Studio, CPPUnit для C ++, JUnit и т. Д. Все это предназначено для одной цели: подключаться к частям вашей программы, запускать заранее определенные сценарии и сообщать об ошибках.

CPPUnit, например, основан на макросах, таких как CPPUNIT_ASSERT_EQUAL, предназначенных для использования примерно так: CPPUNIT_ASSERT_EQUAL (sum (arr), 17). И он сказал бы, если он не равен, и в этом случае тест будет считаться несостоявшимся.

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

Модульные тесты требуются для каждой современной разработки программного обеспечения, поскольку опыт показывает, что они повышают скорость разработки. Также предполагается, что код модульного теста может служить своего рода «документацией» для библиотеки.

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

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

Ручной контроль качества - последний и самый важный тип тестирования программного обеспечения. Идея состоит в том, чтобы подготовить план тестирования, который выполняется на этапах проектирования и кодирования, собирая все идеи, которые разработчики имели во время кодирования каждого оператора if, как на самом деле выполнить этот конкретный оператор if по менее ожидаемому пути кода. Сотрудники QA, предназначенные для выполнения всего, что может быть сделано с программой без среды разработки, могут следовать полученной процедуре тестирования и своим собственным идеям, чтобы найти больше ошибок.

1 голос
/ 22 мая 2019

Когда я разрабатываю функцию, как мне ее протестировать?Например: при работе с функцией суммирования я должен проверять каждое возможное входное значение или только некоторые ограничения?Как насчет тестирования функций со строками в качестве параметров?Вы можете использовать тип проверки черного ящика для анализа граничных значений

В большой программе, нужно ли мне тестировать каждый его фрагмент кода?Когда вы, ребята, программируете, вы тестируете каждый написанный код?Да, вы должны подтвердить, что каждый модуль работает согласно ожидаемым результатам

Как работает автоматизированный тест и как его можно попробовать?Как работают инструменты для автоматического тестирования и что они делают?Автоматизация тестирования зависит от различных факторов, напр.Объем проекта, время, стоимость, доступный ресурс и т. Д.Рекомендую изучить концепции автоматизации тестирования

Я слышал о модульном тестировании.Могу ли я получить краткое объяснение по этому поводу?Что такое тестирование?,Зависит от вашего выбора языка программирования, потому что в python предусмотрены юнит-тесты, а в java есть еще одна инфраструктура для юнит-тестирования

В целом необходимо пройти через концепции и приложения для автоматизации тестирования.

1 голос
/ 01 июля 2010

Что тестировать

Есть пара действительно полезных концепций, которые помогли мне разобраться в этом:

Эквивалентное разделение говорит: «Выполнение теста в этом контексте с этими событиями эквивалентно этому другому тесту здесь, поэтому мне не нужно делать оба».

Граничный анализ говорит: «Вот точка, в которой изменение контекста или другого события приводит к другому результату, поэтому мне понадобятся тесты по обе стороны от этой границы».

Размышление об этом действительно может помочь свести к минимуму количество тестов, которые вам нужно написать.

Когда проверять

Я всегда вручную проверяю свой код, чтобы убедиться, что он работает. Я часто пишу дополнительный модульный тест, который охватывает каждую строку кода, которую я собираюсь написать. Модульный тест не проходит, прежде чем я пишу код, чтобы он прошел. Если это что-то делает пользователь, то я часто пишу приемочный тест или автоматизированный сценарий.

Автоматизированное тестирование

Автоматическое тестирование означает либо создание сценария, либо запись теста, чтобы вам не приходилось делать это вручную - ваш скрипт или код сделает это за вас. Существует два вида средств автоматизации: приспособления для приемочного тестирования на BDD- или на английском языке, которые позволяют писать сценарии, и оболочки для автоматизации, которые упрощают автоматизацию. Так, например, вы можете использовать GivWenZen или Fitnesse в качестве устройства и Selenium в качестве инструмента веб-автоматизации.

Если у вас есть Visual Studio 2008+, вы можете скачать исходный код отсюда и попробовать сценарий, чтобы увидеть его запуск:

http://code.google.com/p/wipflash/

Юнит-тестирование

В самом строгом смысле модульное тестирование означает тестирование элемента кода изолированно от всех других элементов кода. Мы используем макеты вместо реальных фрагментов кода, которые требуются нашему тестируемому коду. На самом деле мы часто прагматично относимся к природе «юнитов» - например, я не копирую доменные объекты.

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

Мне нравится думать о модульном тестировании как о «написании примера того, как я собираюсь использовать код, который собираюсь написать». Этот пример находится в инфраструктуре модульного тестирования и является исполняемым.

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

  • Фреймворки модульного тестирования помогут вам выполнить множество тестов вместе.
  • Фреймворки для приемочного тестирования помогут вам запустить более масштабный сценарий и часто читаются на английском языке.
  • Фреймворки автоматизации обычно располагаются под вашими читаемыми на английском языке фреймворками и помогают вам взаимодействовать с приложением.

Удачи!

1 голос
/ 18 июня 2010

Вы можете разделить тесты на три большие ветви (на самом деле их больше, но если вы новичок, вы должны сначала понять основы): Альфа, Бета, Полный рабочий код.

  1. В альфа-версии вы пробуете каждое значение для каждого куска кода.
  2. В бета-версии вы даете миру предположительно работающее приложение, чтобы получать отзывы от тестировщиков и улучшать его.
  3. Когда ваше приложение полностью работает, вам просто нужно дождаться сообщения об ошибке (оно всегда приходит) от пользователя, который обнаружил эту проблему и исправил ее с помощью патча.

Когда я разрабатываю функцию, как мне ее проверить? Например: при работе с функцией суммирования я должен проверять каждое возможное входное значение или только некоторые ограничения? Как насчет тестирования функций со строками в качестве параметров?

В альфа-версии вы должны думать о ВСЕХ возможностях, с которыми может набираться ваш код. В случае функции sum () их несколько, но если вы разрабатываете, скажем, приложение для большого сервера баз данных, вам необходимо учитывать все возможные входные данные и обрабатывать все возможные ошибки, думать о конечном пользователе как о глупый человек или даже злобный взломщик.

В большой программе я должен тестировать каждый ее фрагмент кода? Когда вы, ребята, программируете, вы тестируете каждый написанный код?

Да, Майкрософт, нет. (лови шутку;))

Как работает автоматизированный тест и как его попробовать? Как работают инструменты для автоматического тестирования и что они делают?

Никакая автоматизация не может победить человеческий интеллект и хороший отладчик (это единственный инструмент, который вам действительно нужен!)

Я слышал о модульном тестировании. Могу ли я получить краткое объяснение по этому поводу?

http://en.wikipedia.org/wiki/Unit_testing

Что такое среда тестирования?

http://en.wikipedia.org/wiki/Test_automation_framework

1 голос
/ 18 июня 2010

Я нашел книгу «JUnit Pocket Guide» Кента Бека отличным (и дешевым, и компактным!) Введением в модульное тестирование: книга разбита примерно на разделы, посвященные достоинствам программ, управляемых тестированием, и общим методам тестирования. затем перейдем к специфике фреймворка JUnit (который он создал).

http://www.amazon.co.uk/JUnit-Pocket-Guide-Kent-Beck/dp/0596007434/ref=sr_1_7?ie=UTF8&s=books&qid=1276811600&sr=8-7

Что касается вашего запроса на некоторые иллюстративные примеры модульного тестирования; этот учебник по JUnit неплох:

http://www.clarkware.com/articles/JUnitPrimer.html#testcase

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...