Создание объектов кодированных данных с использованием реальных данных из базы данных для модульного тестирования - PullRequest
0 голосов
/ 16 ноября 2018

Я собираюсь написать несколько модульных тестов для моего метода:

using System.Linq;
...
public int CountEnabledEvents(IEnumerable<Event> events) 
{
    return events.Count(e => e.IsEnabled);
}

Как вы можете видеть, ввод этого метода - коллекция IEnumerable<Event>.

Event класс выглядит как

public class Event
{
    public Guid Id { get;set; }
    public bool IsEnabled { get;set; }
    public string SomeOtherProp { get;set; }
    ...
}

Итак, я собирался создать несколько фиктивных событий для моего тестового класса:

var event1 = new Event() {
    Id = new Guid("..."),
    IsEnabled = true
}
var event2 = new Event() {
    Id = new Guid("xxx"),
    IsEnabled = false
}

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

¿Есть ли какие-либопрограммного обеспечения или метода для создания этих фиктивных Event объектов из реальных данных, которые у меня есть в базе данных, автоматическим способом?

Спасибо за ваше время.

РЕДАКТИРОВАТЬ

Я думал, что было очевидно, что код, который я предоставил, является упрощением реального кода.Реальный метод, который я хотел бы использовать для модульного тестирования, более сложен, как и фактический Event.

Так что да, довольно утомительно записывать N ^ N возможностей для реального объекта события.И нет, я не пытаюсь проверить интеграцию с базой данных или что-то в этом роде.Я пытаюсь создать статические экземпляры, закодированные в реальном тесте, с данными, которые у меня есть в базе данных .Не во время тестирования, а раньше.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Я действительно не понимаю, что утомительно или почему использование реальных данных сделает тест более точным. В любом случае, вы смотрите только на собственность IsEnabled. Несколько жестко запрограммированных событий сделали бы это, но если вы хотите просто сгенерировать случайные события, где настройка модульного теста отслеживает, сколько было сгенерировано IsEnabled = true, и сравните это с результатом вызова CountEnabledEvents(randomizedEvents).

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

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

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

  2. Возможно, у вас уже есть механизм для сериализации / десериализации ваших событий (например, из / в JSON). Вы можете прочитать события из БД в их сериализованной форме, скопировать их в настройку модульного тестирования, которая также десериализует события во время выполнения.

0 голосов
/ 20 ноября 2018

Вероятно, есть несколько способов приблизиться к этому:

Похоже, что вы после модульных тестов на основе состояния, но тестовые данные широко представлены в хранилище данных.Вы можете использовать это хранилище данных для создания некоторого состояния (объектов) в c #, генерируя соответствующие «наборы данных», а затем используйте это.

Другой вариант может заключаться в том, чтобы ограничить данные в хранилище тестовых данных.это служит соответствующим набором данных, а затем некоторые фабрики / хранилища / DAO создают требуемые объекты непосредственно из хранилища данных.Набор данных может быть извлечен в гораздо меньшую базу данных, которая сохраняется где-то в доступном месте или даже может быть извлечена в какой-то другой формат (xml, json) и извлечен оттуда.

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

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

Вы можете зайти так далеко, что создадите атрибут, который вводит тестовые значения, но извлекает их через некоторую реализацию интерфейса.По линиям Атрибут TestCase .Он будет немного более сложным, чем атрибут TestCase, и может быть определенными атрибутами, которые знают, как извлечь данные.

update :

Я только что прочиталответ, предоставленный p | a | x, и мы, кажется, думаем в том же духе:)

0 голосов
/ 16 ноября 2018

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

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

Вам потребуется поискать интеграционное тестирование для своих целей.Если вы хотите использовать его с Entity Framework 6. Может быть, вам стоит взглянуть на это: https://github.com/zzzprojects/EntityFramework-Effort (учтите, что они также смешивают юнит-тесты и интеграционные тесты)

...