Лучшие практики Интеграционного тестирования

"Защищенное" ключевое слово означает, что только тип и типы, которые происходят из того типа, могут получить доступ к участнику. D не имеет никаких отношений к C, поэтому не может получить доступ к участнику.

у Вас есть несколько опций, если Вы хотите смочь получить доступ к тому участнику

  • , Делают это, общественность
  • Делает это внутренним. Это позволит любым типам получать доступ к участнику в рамках того же блока (или другие блоки должны Вы добавлять, друг)
  • Получают D из РЕДАКТИРОВАНИЯ C

, Этот сценарий вызывается в разделе 3.5.3 из спецификации C#.

причина, которую это не позволяется, состоит в том, потому что она допускала бы перекрестные вызовы иерархии. Предположите, что в дополнение к D, был другой базовый класс C по имени E. Если бы Ваш код мог бы скомпилировать его, позволил бы D получать доступ к участнику E.F. Этот тип сценария не позволяется в C# (и я верю CLR, но я не делаю 100% знают).

EDIT2, Почему это плохо

Протест, это - мое мнение

причина, которую это теперь позволяется, это, делает очень трудным рассуждать о поведении класса. Цель модификаторов доступа состоит в том, чтобы передать управлению разработчика точно, кто может получить доступ к определенным методам. Предположите, что следующий класс

sealed class MyClass : C {
  override F(D d) { ... } 
}

Рассматривает то, что происходит, если F является несколько строго ограниченной во времени функцией. С текущим поведением я могу рассуждать о правильности моего класса. В конце концов, существует только два случая где MyClass. F назовут.

  1. , Где это вызывается в C
  2. , Где я явно вызываю его в MyClass

, я могу исследовать эти вызовы и прийти к разумному заключению о том, как MyClass функционирует.

Теперь, если C# действительно позволяет перекрестный защищенный доступ иерархии, я не могу сделать такую гарантию. Любой в совершенно другом блоке может приехать и произойти из C. Затем они могут назвать MyClass. F по желанию. Это делает абсолютно невозможным рассуждать о правильности моего класса.

20
задан Chris Conway 2 October 2009 в 20:30
поделиться

5 ответов

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

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

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

15
ответ дан 30 November 2019 в 00:05
поделиться

У нас есть экземпляр SQL Server Express с одним и тем же определением БД, работающим на каждой машине разработчика как часть среды разработки. При аутентификации Windows строки подключения стабильны - в строке нет имени пользователя / пароля.

Что мы действительно хотели бы сделать, но еще не сделали, так это посмотреть, сможем ли мы заставить нашу систему работать на SQL Server Compact Edition , который похож на SQLite с ядром SQL Server. Затем мы могли бы запускать их в памяти, а также, возможно, параллельно (с несколькими процессами).

3
ответ дан 30 November 2019 в 00:05
поделиться

в NUnit вы можете украсить свои тестовые классы (или методы) атрибутом, например:

[Category("Integration")]
public class SomeTestFixture{
    ...
}
[Category("Unit")]
public class SomeOtherTestFixture{
    ...
}

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

11
ответ дан 30 November 2019 в 00:05
поделиться

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

Общий подход, который мы используем для решения этой проблемы Проблема состоит в том, чтобы настроить сценарии сборки для чтения строк подключения к базе данных из файла конфигурации, а затем настроить по одному файлу для каждой среды. Например, один файл для WORKSTATION, другой для CI. Затем вы настраиваете сценарии сборки для чтения файла конфигурации на основе указанной среды. Таким образом, сборки, выполняемые на рабочей станции разработчика, запускаются с использованием конфигурации WORKSTATION, а сборки, выполняемые в среде CI, используют настройки CI.

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

5
ответ дан 30 November 2019 в 00:05
поделиться

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

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

3
ответ дан 30 November 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: