NUnit плохой выбор для теста Selenium?

Я прочитал множество ответов на SO при поиске NUnit + зависимых методов + порядок выполнения теста. Каждый ответ подсказывает, что принуждение любого набора ордеров к единичным испытаниям является крайне злым.

Я пишу тесты Selenium, используя NUnit. Поэтому я пытаюсь написать интеграционные тесты с использованием модуля тестирования модулей.

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

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

  • Ненужное дублирование/выполнение кода
  • Что делать, если создание учетной записи приложения не работает, все мои тесты все равно будут пытаться создавать и регистрировать снова и снова и сбой

Я склонен думать, что NUnit может быть неразумным в отношении тестов Selenium. Но если не Nunit, то что я должен использовать?

Ответ 1

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

Подробнее см.

http://www.developerfusion.com/article/84484/light-up-your-development-with-selenium-tests/

Кроме того, использование Nunit и тестов, написанных на С#, намного легче писать и поддерживать. Используете ли вы SetUp и TearDown во время написания тестов? Таким образом вы можете избежать дублирования кода.

Что касается второго момента, вы можете установить флаг, установленный при первом сбое настройки, и пропустит настройку в следующий раз или сама настройка будет отслеживать его и быстро выйти из строя в следующий раз. И тесты не запускаются, если в Nunit произошел сбой.

Ответ 2

Я запускаю селен с NUnit все время. Это зависит от того, как вы пишете свои тесты. Чтобы избежать дублирования кода, я создаю библиотеку вспомогательных функций, которые выполняют общие функции, такие как вход в систему или выход из моего сайта, которые другие тесты используют для доступа к странице, которую они должны тестировать. (Я использую термин "библиотека" в свободном смысле, я фактически не разбиваю их на свой собственный проект С#.)

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

Ответ 3

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

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

Ответ 4

Вы также посмотрели PNunit?

Обратитесь к одному из участников этого вопроса:

Кто-нибудь нашел способ параллельно запускать тесты С# Selenium RC?

Я все еще не уверен на 100%, как TestNG будет работать с сеткой, предположим, что у вас есть трехэтапный процесс регистрации, и вы разделите это на 3 теста. Является ли TestNG с сеткой, которая поможет вам здесь? Я полагаю, нет, или он обнаружит, что для теста C необходимо, чтобы тесты A и B запускались в одном потоке?

PNunit выглядит так, что он может предоставить способ распространения зависимых тестов на одном компьютере. Хотя это, вероятно, довольно сложно настроить.

Ответ 5

Два подхода могут помочь вам, с проблемой, которую вы описываете как ответ AutomatedTester:

Первый, NUnit 2.4.4 определяет SuiteAttribute, который позволяет запускать тесты в том порядке, в котором вы хотите. Очень удобно, но имеет большое ограничение: оно несовместимо с TestCaseAttribute. Это означает, что все ваши тесты должны запускаться только TestAttribute; что очень раздражает, если вы нацеливаете охват граничных тестов на основе стоимости (таким образом, несколько тестовых случаев, основанных на данных). Дополнительная информация о http://www.nunit.org/index.php?p=suite&r=2.5.10

Другой подход заключается в подготовке базы данных примеров интеграции, специально разработанной для ваших тестовых случаев. Скажем, у вас есть процесс регистрации на 15 шагов: создайте запись студента и нажмите его на первый шаг, затем другой студент и нажмите на второй шаг и так далее. Сохраните свою базу данных и восстановите ее как установку тестового оборудования. Затем проверьте каждый шаг с другим учеником.

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

Конечно, для запуска и хранения требуется больше времени, так как копии БД должны быть сохранены. Если ваша система не может этого себе позволить, вы, вероятно, захотите посмотреть на первое решение.

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