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>
[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); } }
3 Réponses :
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.
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?
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.
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.
TaxCalculator ()
a-t-il le même code quegetTax ()
?@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