How can I run the .NET Unit Test several times with a set of cartesianed parameters

I have 1 unit test method that needs several parameters. I would like to run this test once for each possible Cartesian value with a predefined list for each parameter. I assume that the parameters can go through the test context, but I do not want to connect to an external database.

For example: if I had 2 parameters with the following possible values, the test would be performed 6 times (the order does not matter). (Pseudo code)

p1 = { 1, 5, 10 }
p2 = { "blue", "red" }

test 1: ( 1, "red" )
test 2: ( 5, "red" )
test 3: ( 10, "red" )
test 4: ( 1, "blue" )
test 5: ( 5, "blue" )
test 6: ( 10, "blue" )

Note. I use the built-in testing of Visual Studio 2010, not NUnit or one of many other unit test frameworks.

Edit:

, . - / . 2 6 , . scenerio , - .

+3
5

: ", ". -, XML SQL. VS2k8, VS2k10 .

. CSV,

param1, param2
1,
1,
5,
5,
10,
10,

"Test View", , . " ". .

, unit test, testContext.DataRow("param1") testContext.DataRow("param2").

, , . !

, , ,

dim test (, )
   x foo fooCollection
    y bar barCollection
    z foobar foobarCollection '
testResults.add( (x, y, z), "PASS" )
catch ex
testResults.add( (x, y, z), "ERROR:" + ex.toString())

+2

, Gallio in.net

[Test]
[Row(0, 0)]
[Row(1, 1)]
public void Lower_bounds(int x, int expectedResult)
{
   int result = Fibonacci.Calculate(x);
   Assert.AreEqual(expectedResult, result);
}

1: , [Factory] Gallio. 2: -

Jeroen

+4

Pex, .

, ?

+3
, , . T4 script CSV, . script ( T4 Toolbox).
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".csv" #>
<#@ include file="T4Toolbox.tt" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="System.Collections.Generic" #>
<#
    List<CodeEnum> enums = GetEnums("TestClass.cs");    
    bool first = true;

    // Header
    foreach(CodeEnum e in enums)
    {
        if(first)
            first = false;
        else
            Write(",");

        Write(e.Name);
    }
    WriteLine("");

    // Data
    WriteData(enums);
#>
<#+
    private void WriteData(List<CodeEnum> enums)
    {
        WriteData(enums, new string[enums.Count], 0);
    }

    private void WriteData(List<CodeEnum> enums, string[] values, int level)
    {   
        foreach (CodeElement element in enums[level].Children)
        {
            values[level] = element.Name;

            if(level + 1 < enums.Count)
            {
                WriteData(enums, values, level + 1);
            }
            else
            {
                WriteLine(string.Join(",", values));
            }
        }
    }

    private List<CodeEnum> GetEnums(string enumFile)
    {
        ProjectItem projectItem = TransformationContext.FindProjectItem(enumFile);
        FileCodeModel codeModel = projectItem.FileCodeModel;
        return FindEnums(codeModel.CodeElements);
    }

    private List<CodeEnum> FindEnums(CodeElements elements)
    {
        List<CodeEnum> enums = new List<CodeEnum>();

        FindEnums(elements, enums);

        return enums.Count == 0
            ? null
            : enums;
    }

    private void FindEnums(CodeElements elements, List<CodeEnum> enums)
    {
        foreach (CodeElement element in elements)
        {
            if (element is CodeEnum)
                enums.Add((CodeEnum)element);

            FindEnums(element.Children, enums);
        }
    }
#>
0

Source: https://habr.com/ru/post/1748420/


All Articles