Модульный тест вставляет/обновляет/удаляет

Я погуглил это немного и действительно не нашел ответ, в котором я нуждался.

Я работаю над веб-страницей в C# с SQL Server и LINQ для клиента. Я хочу, чтобы пользователи смогли отправить сообщения друг другу. Таким образом, то, что я делаю, - то, что я модульный тест это с данными, которые на самом деле входят в базу данных.

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

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

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

Что надлежащий путь состоит в том, чтобы сделать это, не имея теста, который тестирует большую функциональность в одном тесте?

9
задан marc_s 18 March 2010 в 20:35
поделиться

3 ответа

Выполните все проверки внутри блока System.Transactions.TransactionScope и просто не вызывайте Scope.Complete () ... Все изменения будут отменены при выходе, и другие пользователи не смогут видеть временные данные, которые вы создаете в базе данных, поэтому процесс тестирования повлияет только на тестовую машину.

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

Попросите метод единого модульного тестирования олицетворять двух разных пользователей, все в одной транзакции ...

например код

   using (var scop = new System.Transactions.TransactionScope())
   {
       // all your test code and Asserts that access the database, 
       // writes and reads, from any class, ...
       // to commit at the very end of this block,
       // you would call
       // scop.Complete();  // ..... but don't and all will be rolled back
   }
17
ответ дан 4 December 2019 в 08:32
поделиться

Базы данных модульного тестирования могут быть PITA из-за самой их природы (постоянное хранилище).

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

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

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

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

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

В конечном счете, тестирование базы данных - это отдельный проект.

4
ответ дан 4 December 2019 в 08:32
поделиться

Имейте файл фикстур (в XML, SQL, YAML и т. Д.), Который вы можете загрузить в локальную тестовую базу данных с помощью простой команды.

Например. файл фикстур для двух пользователей, которым необходимо отправлять сообщения друг другу, может выглядеть так (это мой):

Member:

  Member_WibWobble:
    username:       Wibble_Wobble
    email_address:  michael+dev_wibwob@[removed].com
    password:       pw
    is_super_admin: true
    last_login:     "2010-01-06 12:12:57"
    Country:        country_AU
    UploadImage:
      type:         <?php echo UploadImage::TYPE_MEMBER_AVATAR."\n"; ?>
      upload:       "http://localhost/[removed]/images/wibwobble.jpg"

  Member_BunnyHugs:
    username:       BunnyHugs
    email_address:  michael+dev_bunny@[removed].com
    password:       pw
    is_super_admin: true
    last_login:     "2009-12-01 14:11:11"
    Country:        country_UK
    UploadImage:
      type:         <?php echo UploadImage::TYPE_MEMBER_AVATAR."\n"; ?>
      upload:       "http://localhost/[removed]/images/bunnyhugs.jpg"

PrivateMessage:

  PrivateMessage_1:
    subject:          "Yo"
    body:         |
      hi

      <b>escape this html please</b>

      bye
    is_read:          false
    Sender:           Member_WibWobble
    Recipient:        Member_BunnyHugs
4
ответ дан 4 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

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