Есть ли способ использовать данные, которые уже находятся в памяти, для запуска модульных тестов? - PullRequest
9 голосов
/ 10 ноября 2011

Я знаю, что могу использовать данные в файлах для тестирования устройства, например, данные внутри файла CSV или XML.

Например:

[TestMethod]
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.CSV", 
    "Data.csv", 
    "Data#csv", 
    DataAccessMethod.Sequential)]
public void TestData() {}

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

Что-то вроде:

// this structure has the data to use in the unit test
var DataList = new List<string>();

[TestMethod]
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.IEnumerable",
    "DataList", 
    "DataList", 
    DataAccessMethod.Sequential)]
public void TestData() {}

Ответы [ 6 ]

3 голосов
/ 10 ноября 2011

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

<#@ template debug="false" hostspecific="true" language="C#v3.5" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="System.Data.dll" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Linq" #>
<#@ output extension=".cs" #>
<#
        List<string> DataList = AccessInMemoryData();
#>
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestProject1
{
[TestClass]
public class UnitTest1
{
    <# foreach (string currentTestString in DataList) { #>
    [TestMethod]
    public void TestingString_<#= currentTestString #>
    {
    string currentTestString = "<#= currentTestString #>";
    // TODO: Put your standard test code here which will use the string you created above
    }
    <# } #>
}
}
1 голос
/ 29 января 2016

Вы можете использовать MSTestHacks через NuGet для подачи данных из IEnumerable, см. этот ответ .

1 голос
/ 28 марта 2012

I ответил a аналогичный вопрос , и решение, которое я использовал ранее, состоит в создании простого файла CSV из моих данных в памяти.

1 голос
/ 10 ноября 2011

Я не думаю, что вы можете сделать это с атрибутом [DataSource], но вы можете сделать более или менее то же самое вручную.

Загрузите ваши данные в метод, украшенный [AssemblyInitialize] или[ClassInitialize].Затем перепишите свои тесты, чтобы перебрать данные.К сожалению, таким образом, вы получите один тест вместо отдельных результатов на один запуск теста.

1 голос
/ 10 ноября 2011

Простое решение может быть таким ...

private void TestData(IEnumerable what ) { ... your test method ... }

[TestMethod]
public void TestDataInMemory() { List<T> mylist = ...; this.TestData(mylist); }

[TestMethod]
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.CSV", 
    "Data.csv", 
    "Data#csv", 
    DataAccessMethod.Sequential)]
public void TestData() { this.TestData(testContextInstance ...) }

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

0 голосов
/ 10 ноября 2011

Я думаю, Gallio Ambience должен был решить эту проблему. Я не уверен, каково состояние проекта, в настоящее время.

...