Модульный тест вставить / обновить / удалить - PullRequest
9 голосов
/ 18 марта 2010

Я немного погуглил и не нашел ответа, который мне нужен.

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

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

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

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

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

Ответы [ 3 ]

17 голосов
/ 18 марта 2010

Выполните все тесты внутри блока 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
   }
4 голосов
/ 18 марта 2010

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

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

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

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

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

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

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

4 голосов
/ 18 марта 2010

Иметь файл фикстур (в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...