web-dev-qa-db-fra.com

Est-il possible de paramétrer un test de non-vie

Je voudrais écrire une fonction appelable qui accepte deux objets et compare plus de 30 propriétés de ces objets avec des assertions. Le problème est que cela doit être fait pour environ 20 tests unitaires existants et la plupart des tests futurs, et l'écriture des 30 affirmations et plus à chaque fois prend du temps et de l'espace.

J'ai actuellement une fonction de test non unitaire qui compare les objets, et retourne une chaîne avec "pass" ou un message d'échec, et utilise une assertion pour valider celle-ci dans chaque test unitaire. Cependant, c'est assez compliqué et je sens que je vais à l'encontre des méthodes de tests unitaires appropriées.

Existe-t-il un moyen de rendre une fonction appelable à partir de tests unitaires internes qui utilise des assertions pour vérifier les conditions?

27
NewNetProgrammer

Pour répondre à la dernière partie, vous pouvez bien sûr avoir Asserts dans une autre fonction. Les assertions fonctionnent en soulevant des exceptions capturées par le testeur, et interprètent cela comme un échec. Par conséquent, un test comme celui-ci fonctionnera correctement:

public void CheckAsserts(string value)
{
    Assert.IsNotNull(value);
}

[TestCase("yes!")]
public void MyTest(string value)
{
    CheckAsserts(value);
}
26
Massif

Si vous utilisez NUnit 2.5.5 ou une version ultérieure, vous pouvez utiliser l'attribut TestCase.

Les tests unitaires normaux seraient décorés avec [Test], mais nous pouvons le remplacer comme suit:

[TestCase("0", 1)]
[TestCase("1", 1)]
[TestCase("2", 1)]
public void UnitTestName(string input, int expected)
{
    //Arrange

    //Act

    //Assert
}

Ce genre de chose sera la façon de le faire - prenez évidemment différents paramètres.

Regardez ceci pour vous aider: http://nunit.org/?p=testCase&r=2.5

41
stack72

Oui, les tests unitaires sont comme n'importe quel autre code. 

En particulier, consultez NUnit.TestCaseAttribute .

4
jason

Vous pouvez utiliser l'attribut TestCase:

[TestCase("hostname1parameter")]
[TestCase("hostname2parameter")]
public void Example_TestHostName(string hostname)
{
    ...
}
1
hwcverwe

Vous aurez besoin de l'attribut TestCase: 

[TestCase("string1",...)
public void test_UnitTest(string Parameter)
{
    ...
    Assert.AreEqual(Parameter, result)
}

Notez que cela ne fonctionne qu'avec les types de données primitifs tels que strings et ints - vous ne pouvez pas instancier votre propre classe et l'utiliser comme paramètre.

0
Aidan

Vous pouvez également tirer profit de l'introspection en C #. Cela vous permet d’obtenir les noms des champs sans les spécifier dans le code. Vous pouvez ensuite les appeler par leur nom. 

System.Attribute [] attrs = System.Attribute.GetCustomAttributes (t);

Cela vous permet d'écrire certains types de tests qui s'appliqueront à des classes que vous n'avez même pas encore écrites.

0
KellyCoinGuy