Продублируйте поведение теста, управляемого данными - PullRequest
2 голосов
/ 04 августа 2011

Прямо сейчас, если у вас есть тест, который выглядит следующим образом:

[TestMethod]
[DeploymentItem("DataSource.csv")]
[DataSource(
    Microsoft.VisualStudio.TestTools.DataSource.CSV, 
    "DataSource.csv", 
    "DataSource#csv", 
    DataAccessMethod.Sequential)]
public void TestSomething()
{
    string data = TestContext.DataRow["ColumnHeader"].ToString();
    /* 
    do something with the data
    */
}

При выполнении этого теста вы получите столько тестов, сколько у вас будет значений данных.

Что я хотел бы сделать, так это продублировать такое поведение в коде, сохраняя при этом источник данных. Например: допустим, я хочу запустить этот тест для нескольких развернутых версий веб-службы (это функциональный тест, поэтому ничего не проверяется, т. Е. Это вполне может быть тест codedui для веб-сайта, развернутого на нескольких хосты).

[TestMethod]
[DeploymentItem("DataSource.csv")]
[DataSource(
    Microsoft.VisualStudio.TestTools.DataSource.CSV, 
    "DataSource.csv", 
    "DataSource#csv", 
    DataAccessMethod.Sequential)]
public void TestSomething()
{
    var svc = helper.GetService(/* external file - NOT a datasource */);
    string data = TestContext.DataRow["ColumnHeader"].ToString();
    /* 
    do something with the data
    */
}

Теперь, если у меня есть 2 расположения развертывания, перечисленные во внешнем файле, и 2 значения в источнике данных для метода тестирования, я должен получить 4 теста.

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

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

Может кто-нибудь указать мне информацию, которая может помочь мне решить эту мою проблему?

1 Ответ

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

UPDATE! Это работает для Visual Studio 2010, но, похоже, не работает в 2012 и 2013 годах.

У меня была похожая проблема, когда у меня была куча файлов, которые я хотел использовать в качестве тестовых данных в тесте, управляемом данными. Я решил это, сгенерировав файл CSV перед выполнением теста, управляемого данными. Генерация происходит в статическом методе с атрибутом ClassInitialize.

Полагаю, вы могли бы сделать что-то похожее, объединить ваш текущий источник данных с вашим "внешним файлом" и вывести новый источник данных CSV, который используется в вашем тесте на основе данных.

public TestContext TestContext { get; set; }
const string NameColumn = "NAME";
const string BaseResourceName = "MyAssembly.UnitTests.Regression.Source";

[ClassInitialize()]
public static void Initialize(TestContext context)
{
    var path = Path.Combine(context.TestDeploymentDir, "TestCases.csv");
    using (var writer = new StreamWriter(path, false))
    {
        // Write column headers
        writer.WriteLine(NameColumn);

        string[] resourceNames = typeof(RegressionTests).Assembly.GetManifestResourceNames();
        foreach (string resourceName in resourceNames)
        {
            if (resourceName.StartsWith(BaseResourceName))
            {
                writer.WriteLine(resourceName);
            }
        }
    }
}

[TestMethod]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\TestCases.csv", "TestCases#csv", DataAccessMethod.Random)]
public void RegressionTest()
{
    var resourceName = TestContext.DataRow[NameColumn].ToString();
    // Get testdata from resource and perform test.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...