Как я тестирую связанный с базой данных код с NUnit?

62
задан abatishchev 22 April 2016 в 20:50
поделиться

5 ответов

NUnit теперь имеет [Откат] атрибут, но я предпочитаю делать это различный путь. Я использую класс TransactionScope . Существует несколько способов использовать его.

[Test]
public void YourTest() 
{
    using (TransactionScope scope = new TransactionScope())
    {
        // your test code here
    }
}

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

другой путь состоит в том, чтобы использовать [Установка] для создания TransactionScope, и [Разрушение] для вызова Располагают на нем. Это отключает некоторое дублирование кода, но выполняет то же самое.

[TestFixture]
public class YourFixture
{
    private TransactionScope scope;

    [SetUp]
    public void SetUp()
    {
        scope = new TransactionScope();
    }

    [TearDown]
    public void TearDown()
    {
        scope.Dispose();
    }


    [Test]
    public void YourTest() 
    {
        // your test code here
    }
}

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

сказавший все, что я действительно думаю, что тестирует тот хит, база данных не является действительно модульными тестами. Я все еще пишу им, но я думаю о них как об интеграционных тестах. Я все еще рассматриваю их как обеспечение значения. Одно место я использую их часто, находится в тестировании LINQ к коду SQL. Я не использую разработчика. Я вручаю записи DTO и атрибуты. Я, как было известно, понял его превратно. Справка интеграционных тестов ловит мою ошибку.

73
ответ дан Paul Williams 24 November 2019 в 16:52
поделиться

Я просто перешел к группе пользователей.NET, и предъявитель сказал, что использовал SQLlite в тестовой установке и разрушении и использовал в параметре памяти. Он должен был уклониться от соединения немного, и явный уничтожают соединение, но это дало бы чистому DB каждый раз.

http://houseofbilz.com/archive/2008/11/14/update-for-the-activerecord-quotmockquot-framework.aspx

4
ответ дан nportelli 24 November 2019 в 16:52
поделиться

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

Обычно я полагаюсь на ORM для своего datalayer, и таким образом я не пишу модульные тесты на очень там. Я не чувствую потребность к коду модульного теста, который я не пишу. Для кода, который я добавляю в слое, я обычно использую внедрение зависимости в краткий обзор фактическое соединение к базе данных так, чтобы, когда я тестирую свой код, это не касалось фактической базы данных. Сделайте это в сочетании с платформой насмешки для лучших результатов.

2
ответ дан tvanfosson 24 November 2019 в 16:52
поделиться

Для этого вида тестирования я экспериментировал с NDbUnit (работающий дружно с NUnit). Если не изменяет память, это был порт DbUnit с платформы Java. Это имело много гладких команд для просто вида вещи, которую Вы пытаетесь сделать. Проект, кажется, переехал сюда:

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

(это раньше было в http://ndbunit.org ).

источник, кажется, доступен по этой ссылке: http://ndbunit.googlecode.com/svn/trunk/

1
ответ дан Scott Lawrence 24 November 2019 в 16:52
поделиться

Рассмотрите возможность создания сценария базы данных, чтобы его можно было запускать автоматически из NUnit, а также вручную для других видов тестирования. Например, если вы используете Oracle, запустите SqlPlus из NUnit и запустите скрипты. Такие сценарии обычно быстрее пишутся и легче читаются. Кроме того, что очень важно, запуск SQL из Toad или аналогичного приложения более нагляден, чем запуск SQL из кода или прохождение через ORM из кода. Обычно я создаю скрипт установки и скрипт разрушения и помещаю их в методы установки и разрушения.

Стоит ли вообще обращаться к БД из модульных тестов - это другая дискуссия. Я считаю, что часто это имеет смысл делать. Для многих приложений база данных является абсолютным центром действия, логика в значительной степени основана на множествах, а все остальные технологии, языки и методы являются призраками. И с развитием функциональных языков мы начинаем понимать, что SQL, как и JavaScript, на самом деле является отличным языком, который все эти годы был у нас под носом".

Просто в качестве примера, Linq to SQL (который мне нравится по концепции, но я никогда не использовал его) кажется мне способом делать сырой SQL внутри кода, не признаваясь в том, что мы делаем. Некоторые люди любят SQL и знают, что он им нравится, другие любят его и не знают, что он им нравится :)

.
0
ответ дан 24 November 2019 в 16:52
поделиться
Другие вопросы по тегам:

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