【问题标题】:Parametrized tests using Nunit 3.x使用 Nunit 3.x 进行参数化测试
【发布时间】:2017-10-16 14:37:21
【问题描述】:

我在测试时遇到以下情况,我想问你们是否有测试这个的捷径。

[Test]
[TestCaseSource(nameof(MlTestCases))]
[TestCaseSource(nameof(QaTestCases))]
public void EditBetSlip_ShouldConvertOddsFromAmericanToDecimal(string selectionId)
{
    // Arrange
    var betSlipRequest = new PostBetSlipRequest
    {
        OddStyle = OddStyle.American.ToString(),
        Selections = new List<PostOneSelectionRequest>
        {
            new PostOneSelectionRequest
            {
                DisplayOdds = $"+{Fixture.Create<int>()}",
                Id = selectionId.Replace("#", "%23"),
            },
        },
        Bets = new List<PostOneBetRequest>
        {
            new PostOneBetRequest
            {
                OddStyle = OddStyle.American.ToString(),
                Id = 0,
                Stake = 10,
            },
        },
    };

    // Act
    _client.EditBetslip(betSlipRequest);
    var response = _client.RefreshBetslip(new GetBetSlipRequest { OddStyle = OddStyle.European.ToString() });
    var betslip = response.DeserializedBody;

    // Assert
    Assert.IsTrue(response.StatusCode == HttpStatusCode.OK);

    foreach (var selection in betslip.Selections)
    {
        Assert.DoesNotThrow(() => decimal.Parse(selection.DisplayOdds));
    }
}

现在我需要再次进行相同的测试,但只需翻转 OddStylePostBetSlipRequestGetBetSlipRequest。我尝试使用 [Values] 属性,但它没有按我想要的方式工作。

我想要的是用American - European 执行所有这两个测试用例源一次,然后用European - American 执行一次,这可能吗?

【问题讨论】:

    标签: c# unit-testing testing nunit nunit-3.0


    【解决方案1】:

    每个场景(US --> Eur & Eur --> US)肯定是测试方法的新测试用例吗?

    你有 n 个测试用例,其中 n = QaTestCases 的总数 + MlTestCases 的总数。

    您实际上想要测试 2n 个测试用例(每个 [Eur --> US, US --> Eur] 排列的每个现有测试用例)。因此,我建议这应该只是一个新的TestCaseSource,使用现有的并添加 Eur/US 排列。

    把它剥回来,你刚才隐约有这样的东西:

    [Test]
    [TestCaseSource(nameof(TestCaseSourceA))]
    [TestCaseSource(nameof(TestCaseSourceB))]
    public void GivenX_ShouldReturnOk(string input)
    {
        //some test
        Assert.Pass();
    }
    
    public static IEnumerable<string> TestCaseSourceA()
    {
        yield return "a1";
        yield return "a2";
    }
    public static IEnumerable<string> TestCaseSourceB()
    {
        yield return "b1";
        yield return "b2";
    }
    

    给出这组结果:

    而你真的想要更像这样的东西:

    [Test]
    [TestCaseSource(nameof(TestCaseSourceMaster))]
    public void GivenX_ShouldReturnOk(string input, string fromOddsStyle, string toOddsStyle)
    {
        //some test
        Assert.Pass();
    }
    
    public static IEnumerable<string[]> TestCaseSourceMaster()
    {
        return TestCaseSourceA()
            .Concat(TestCaseSourceB())
            .SelectMany(t => new string[][]
            {
                new string[]{t,"US","Eur"},
                new string[]{t,"Eur","Us"}
            });
    }
    
    public static IEnumerable<string> TestCaseSourceA()
    {
        yield return "a1";
        yield return "a2";
    }
    public static IEnumerable<string> TestCaseSourceB()
    {
        yield return "b1";
        yield return "b2";
    }
    

    【讨论】:

    • 嗯,是的,在我发布问题后,我实际上有点这样做,但现在我发现它有点麻烦,因为我需要编写所有那些会污染我的测试夹具的静态“帮助”方法(当然我可以在另一个类中提取它们,但仍然)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多