2010-08-31 23 views
4

Je suis intéressé à pouvoir instancier plusieurs tests avec des arguments constructeurs qui lui sont passés à l'exécution par une méthode statique ou une propriété retournant un IEnumerable.Nunit a paramétré TestFixtures avec des paramètres définis lors de l'exécution?

Dans Nunit 2.5, ils ont introduit des tests paramétrés et des montages d'essai. Ils vous permettent d'écrire un seul test et de l'exécuter avec plusieurs entrées fournies à l'aide de l'attribut TestCase, et d'écrire une seule classe de test et d'en instancier plusieurs instances avec des arguments constructeurs différents respectivement. En plus de cela, il est possible de créer plusieurs cas de test basés sur la sortie d'une propriété ou d'une méthode, en utilisant l'attribut TestCaseSource. Cela utilisera la sortie d'une méthode/propriété qui implémente IEnumerable pour créer un ensemble de testcases, un par objet dans la liste. C'est ce que j'aimerais pouvoir faire, mais pas au niveau du test.


quelques informations sur mon cas d'utilisation:

Je teste des logiciels de simulation, et un « environnement de simulation » qui doit être chargé (à partir d'un objet sérialisé) avant que les simulations peuvent être exécutées. Il y a environ 5 types différents de sim, donc ma classe de test a 5 méthodes de test (une pour chaque type de sim). J'utilise actuellement l'héritage (au lieu d'appareils paramétrés) pour exécuter les scénarios de test dans plusieurs environnements de simulation (une demi-douzaine environ), qui ont été extraits de données de production. Mon problème vient du fait que dans une tentative récente d'augmenter la couverture de code, nous avons généré automatiquement toutes les combinaisons possibles de composants de simulation, résultant dans plus de 100 environnements SIM. Je ne veux pas créer de classes héritées pour chacun d'entre eux, donc j'utilise TestCaseSource avec une propriété qui retourne tous les espaces de travail dans un dossier et modifie les tests pour qu'ils (re) chargent l'environnement sim dans le test lui-même. chaque cas de test.

Idéalement, je voudrais avoir un appareil par environnement de simulation, et déterminer combien/quoi ils sont à l'exécution. Je sais que je peux faire le premier via le codage en dur des chemins de l'environnement sim dans plus de 100 attributs TestFixture, puis-je faire le dernier?

Répondre

5

J'ai envoyé le Nunit-Discuss list à ce sujet et j'ai eu la réponse ci-dessous de Charlie Poole. En bref, ce n'est pas encore possible, mais on le regarde pour les futures versions de Nunit.

Hi,

Simply stated, what you want is coming, but it's not here yet. Parameterized fixtures are (as you have discovered) limited by the fact that you can only use arguments that are permitted in attributes. We'd like to have a way that allows use of properties and methods as for test cases but fixtures are a bit more complicated, since the type may be generic.

Have you considered using a generic fixture as a workaround? You could pass in the environment as a Type (or Types) and any constructor arguments as non-type arguments. I don't know your app, so take this with a grain of salt, but how about something like...

[TestFixture(typeof(Environment1), 42, "string")] 
public class TestClass<T> 
{ 
    IEnvironment env; 

    public TestClass(int n, string s) 
    { 
     env = new T(n, s); 
    } 
    ... 

} 

Note that this is "maillistcode" so may not work. :-)

Charlie

+0

Malheureusement, le code ne fonctionne pas. 'env = new T (n, s);' donne l'erreur: "'T': ne peut pas fournir d'arguments lors de la création d'une instance de type variable" – urig