Вопрос

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

  1. Создайте издевательства объектов и подключите их. Это имеет преимущество в том, что он имеет преимущество в том, что он имеет преимущество в том, что он имеет преимущество не нуждающейся в базе данных, но пришло время потребляет время, и я не уверен, сколько возврата инвестиций я получаю. Я немного попал в IOC и MOQ, но все еще кажется болезненным.
  2. Создание сценариев базы данных установки и разрыва для создания известных случаев и тестирование для тех. Опять же, может быть времени интенсивным, но все же легче создавать, чем издевательства в большую часть времени. И другие люди на работе все еще могут запускать его, предполагая, что у них есть SQL Server на их localhost.
  3. Вручную проверить базу данных DEV и модифицируйте тесты подразделения. Интенсивно ручная работа, но если у меня есть «тестовый набор», который не изменится, кажется, работает нормально. На моей машине, по крайней мере :-).

Я знаю, вариант 1 - это «правильный» способ выполнения тестов подразделений, но из трех, вероятно, вариант, который я использовал наименее (хотя последние проекты были с IOC, так что дверь открыта для меня). Я понимаю, что многие из этого зависит от того, что именно издевается и то, что тестируется, но что я здесь не хватает?

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

Это было полезно?

Решение

Первый, который не должен быть таким трудно, если у вас есть слой доступа к данным, который обнародовал просто горсть IQueryable<T> методы. Там хороший трюк, который вы можете использовать для поддельных данных: просто храните объекты объекта в List<T> и использовать AsQueryable. Отказ Я нахожу это проще, чем MOQ для деталей данных.

Что касается МОК, я возьму положение, которое в настоящее время чрезмерно использовано (осознавать, что мое мнение представляет меньшинство программистов в этом отношении). Вы можете использовать инструмент, как Моли Во время тестирования в макет без необходимости злоупотреблять дизайном вашей программы. Я не использую IOC, если только дизайн на самом деле не требует этого.

Другие советы

Я определенно продолжит использовать настоящие тесты подразделения (вариант 1). Мне нравится совет Стивена для этого.

Вы также можете найти интеграционные тесты с фактической базой данных (опция 2) необходимо Использовать также (вариант 2). Почему? Потому что часть того, что вам нужно проверить (отображение O / R, совместимость с фактической схемой БД и т. Д.) Не охватываются настоящими модулями.

Что касается установки и логики разрыва, наследство от этого обычно хватает (с использованием .NET, NUNIT и SQLSERVER для базы данных):

using System.Transactions;
using NUnit.Framework;
namespace Crown.Util.TestUtil
{
    [TestFixture]
    public class PersistenceTestFixture
    {
        public TransactionScope TxScope { get; private set; }

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

        [TearDown]
        public void TearDown()
        {
            if (TxScope != null)
            {
                TxScope.Dispose();
                TxScope = null;
            }
        }
    }
}

Проще простого.

На этом есть целый набор ответа на это. Первое, что нужно сделать, это четко сформулировать то, что вы тестируете. Это фасад API, который имеет базу данных за ним, DAO объекты, структура базы данных?

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

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

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

Что вы тестируете действительно, что заставляет вас чувствовать, что это сложно?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top