0
votes

C # Essai de test en boucle à travers des cas de test

Je cherche à utiliser le cadre de test MS pour tester une calculatrice d'impôt et doit effectuer plus de 100 cas de test. Comme voir ci-dessous, j'ai mis en place une gamme de tests et de boucles à travers chacun mais lorsque je passe des tests, il ne renvoie qu'un seul retour.

Question: P>

  1. Y a-t-il un moyen pour chaque affichage de test? LI>
  2. Comment puis-je retourner chaque résultats de test? Actuellement, le système ne renvoie que des valeurs si elles ont échoué. LI> OL>
                [DataTestMethod]
                public void CalculateResult(int val)
                {
    
                    // arrange
                    int[] testCase = { 1000,2000, 35000, 400003, 59509 };
    
                    foreach (int income in testCase)
                    {
    
                        double expectOutput = TaxCalculator(income);
    
                        // act
                        
                        SUT.GeneralTaxRule generalTaxationRule = new SUT.GeneralTaxRule(income);
                        
                        double actualOutput = generalTaxationRule.getTax();
    
                        // assert
                        Assert.AreEqual(expectOutput, actualOutput);
                        Console.WriteLine(expectOutput, actualOutput);
                    }
    
                }
    


4 commentaires

TaxCalculator () a-t-il le même code que getTax () ?


@crowcoder, oui.


Ensuite, tout ce que vous testez, c'est que les deux méthodes retournent la même chose. Ce n'est pas un test valide.


Si vous ne tenez pas compte de Testing Framework, vous aurez peut-être besoin de: Le moyen le plus simple de comparer des tableaux en C # ou LINQ Comparez deux tableaux et retournez la position et les valeurs qui ne correspondent pas


3 Réponses :


2
votes

Lorsque vous utilisez l'attribut DataTestMethod , vous devez avoir des attributs pour chaque DataRow

[DataTestMethod]
[DynamicData(nameof(TestData), DynamicDataSourceType.Method)]
public void CalculateResult(int income)
{
    double expectOutput = TaxCalculator(income);

    // act                        
    SUT.GeneralTaxRule generalTaxationRule = new SUT.GeneralTaxRule(income);                        
    double actualOutput = generalTaxationRule.getTax();

    // assert
    Assert.AreEqual(expectOutput, actualOutput);
    Console.WriteLine(expectOutput, actualOutput);
}

public static IEnumerable<object[]> TestData()
{
    yield return new object[] { 1000 };
    yield return new object[] { 2000 };
    /// etc.
}

Une autre façon d'obtenir la même chose est d'utiliser Attribut DynamicData

[DataTestMethod]
[DataRow(1000)]
[DataRow(2000)]
// etc
public void CalculateResult(int income)
{
    double expectOutput = TaxCalculator(income);

    // act                        
    SUT.GeneralTaxRule generalTaxationRule = new SUT.GeneralTaxRule(income);                        
    double actualOutput = generalTaxationRule.getTax();

    // assert
    Assert.AreEqual(expectOutput, actualOutput);
    Console.WriteLine(expectOutput, actualOutput);
}

Vous pouvez les données piloter les données comme vous le souhaitez dans TestData ci-dessus (par exemple un fichier, une base de données, ou codé en dur). Il existe également d'autres options pour DynamicDataSourceType que vous pouvez étudier.


1 commentaires

oui mais le problème est que j'aurai un tableau de 100 valeurs différentes, très gênant de le faire dans le cadre MS? Une meilleure façon?



0
votes

Si vous utilisez un [DataTestMethod] , vous pouvez ajouter des cas de test via un ou plusieurs [DataRow (...)] attribut (s):

[DataTestMethod]
[DataRow(1000)]
[DataRow(2000)]
[DataRow(35000)]
[DataRow(400003)]
[DataRow(59509)]
public void CalculateResult(int val)
{
    double expectOutput = TaxCalculator(val);

    // act  
    SUT.GeneralTaxRule generalTaxationRule = new SUT.GeneralTaxRule(val);
    double actualOutput = generalTaxationRule.getTax();

    // assert
    Assert.AreEqual(expectOutput, actualOutput);
    Console.WriteLine(expectOutput, actualOutput);
}

De cette façon, vous pouvez inspecter le résultat du test pour chaque val dans la fenêtre de l'Explorateur de tests.


0 commentaires

1
votes

En utilisant Xunit, vous pouvez le faire comme ceci:

private static int[] incomesArray = { 1000,2000, 35000, 400003, 59509 };

public static IEnumerable<object[]> GetIncomeTestData =>
                incomesArray
                .Select(x => new object[] { x })
                .ToArray();

[Theory]
[MemberData(nameof(GetIncomeTestData))]
public void CalculateResult(int income)
{
    // arrange
    var expectOutput = TaxCalculator(income);
    var generalTaxationRule = new SUT.GeneralTaxRule(income);
                
    // act            
    var actualOutput = generalTaxationRule.getTax();

    // assert
    Assert.Equal(expectOutput, actualOutput);
}

Vous pouvez avoir autant de valeurs dans incomesArray que vous le souhaitez et vous pourrez pour voir le résultat de chaque valeur de test.


0 commentaires