2009-10-27 3 views
1

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

я в основном имеют класс называется FooDataAccess с несколькими очень простыми функциями, позволяет сказать, что 3 из них, как это:

int InsertFoo(string fooName) 
void UpdateFoo(int fooID, string fooName) 
void InsertFoosDepedency(int fooID, string someValue) 

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

1) Создать (Unit тест) База данных сценария, 2) Создание объектов сценариев, 3) Вставка таблицы перекодировки значений и 4) Удалить все Но таблицы поиска значения

Идея заключается в том, кто первым использованием проекта должен вручную запускать скрипты 1-3 вручную как одноразовую настройку. Затем выполнить скрипт # 4 при запуске каждого модульного тестирования ... (в небольших приложениях, вы можете даже запустить их все на уровне тестирования)

ОК, до сих пор так хорошо ...

Поэтому у меня есть моя база данных тестовых баз данных, как пустой список. Проверка первой функции InsertFoo(), очевидно, очень проста. Я вызываю функцию, затем просто Assert (ExecuteSQL («select count (*) from foo»)> 1), Assert (ExecuteSQL («select fooName from t_foo») = ожидается)) и т. Д.

Где я «Некоторыми застрявшими являются те, которые требуют зависимостей, таких как 3-я функция в моем примере или даже обновление.

Имеет ли смысл временно отказаться от ограничений внешнего ключа для области моего теста? В противном случае для модульной проверки функции InsertFoosDepedency (int fooID, string someValue) мне пришлось бы сначала выполнить произвольный sql (вручную вставить запись в таблицу FOO и вернуть FooID) ...

OR, должен ли я просто сделать последнее?

Все отзывы очень ценятся.

UPDATE: его работа с встроенным SQL для создания иждивенцев. Думаю, я просто ищу комментарии & критики по этому методу для модульного тестирования DAL. Еще раз спасибо

ответ

2

Это звучит очень похоже на то, что я делаю. Я уничтожаю все данные в базе данных по адресу start of each test, а затем создаю только то, что требуется для этого теста в фазе установки тестов.Так что для UpdateFoo я бы

void update_existingKey_updatesValue() { 
    String expected = "jeff"; 

    clearDatabase(); 
    // Note I would use dbUnit. 
    executeSQL("insert into foo values (1, 'fred')"); 

    DAL subject = new DAL(...); 
    subject.update(1, expected); 

    //Note I would use dbUnit. 
    String actual = executeSQL("select name from foo where id = 1"); 
    assert(expected, actual); 
} 

В Java я использую инструмент под названием dbUnit, ваши имена методов предполагают C#, так что я укажу вам на dbUnit.Net однако я никогда не использовал это. Это обеспечивает более удобный (IMO anyway) метод заполнения базы данных и проверки содержимого базы данных.

1

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

Вы можете использовать Mock Objects?

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

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

Или вам просто нужно выполнить свою тестовую настройку в методе тестирования (и вы можете использовать Teardown для опорожнения БД впоследствии).

+1

Я использую Mock Objects уже для всех абонентов на моем DAL. Но я все равно хотел бы еще раз протестировать функции DAL. Я не слишком боюсь завинчивать базу данных, потому что это база данных, созданная специально для модульного тестирования. Возможно, мне нужно просто вызвать функцию InsertFoo() для создания моего foo и получить идентификатор для зависимостей? но это нарушит концепцию того, что это «единичный» тест ??? – dferraro

+0

Я не уверен, что последовал за тобой. Конечно, сначала нужно вставить зависимости, чтобы что-то могло зависеть от них? Вы имеете в виду иждивенцев, а не зависимости? – serialhobbyist

+0

Вы правы, моя вина. Я имел в виду иждивенцев. Еще раз спасибо – dferraro