Quand utiliser l'attribut TestFixtureSetUp au lieu d'un constructeur par défaut?

StackOverflow https://stackoverflow.com/questions/212718

  •  03-07-2019
  •  | 
  •  

Question

La documentation de NUnit ne me dit pas quand utiliser une méthode avec un TestFixtureSetup ni quand faire l’installation dans le constructeur.

public class MyTest
{
    private MyClass myClass;

    public MyTest()
    {
        myClass = new MyClass();
    }

    [TestFixtureSetUp]
    public void Init()
    {
        myClass = new MyClass();
    }
}

Existe-t-il des bonnes / mauvaises pratiques concernant le constructeur TestFixtureSetup par rapport au constructeur par défaut ou n'y a-t-il aucune différence?

Était-ce utile?

La solution

Je pense que cela a été l’un des problèmes qui n’a pas été traité par l’équipe nUnit. Cependant, il existe l'excellent projet xUnit qui a vu ce problème et a décidé que les constructeurs étaient une bonne chose à utiliser sur initialisation du dispositif de test .

Pour les non-initiés, ma meilleure pratique dans ce cas a été d'utiliser TestFixtureSetUp , TestFixtureTearDown , SetUp et TearDown comme décrit dans la documentation.

Je pense que cela m'aide aussi lorsque je ne pense pas à un appareil de test nUnit comme à une classe normale, même si vous le définissez avec cette construction. Je les considère comme des rencontres, ce qui me permet de surmonter l’obstacle mental et me permet d’ignorer cette question.

Autres conseils

Pourquoi devriez-vous utiliser un constructeur dans vos classes de test?

J'utilise les méthodes [Configuration] et [TearDown] pour le code à exécuter avant et après chaque test, et de la même manière [TestFixtureSetUp] et [TestFixtureTearDown] des méthodes marquées pour que le code ne soit exécuté qu'une seule fois avant et après que tous les tests du projecteur ont été exécutés.

Je suppose que vous pourriez probablement remplacer le [TestFixtureSetUp] par un constructeur (bien que je n’aie pas essayé), mais cela semble seulement rompre avec la convention claire fournie par les méthodes marquées.

Une chose que vous ne pouvez pas faire avec [TestFixtureSetup] et que vous pouvez effectuer dans le constructeur est de recevoir des paramètres de [TestFixture] .

Si vous souhaitez paramétrer votre appareil de test, vous devrez utiliser le constructeur pour au moins certains de la configuration. Jusqu'à présent, je ne l'ai utilisé que pour les tests d'intégration, par exemple. pour tester une couche d'accès aux données avec plusieurs fournisseurs de données:

[TestFixture("System.Data.SqlClient",
  "Server=(local)\\SQLEXPRESS;Initial Catalog=MyTestDatabase;Integrated Security=True;Pooling=False"))]
[TestFixture("System.Data.SQLite", "Data Source=MyTestDatabase.s3db")])]
internal class MyDataAccessLayerIntegrationTests
{
    MyDataAccessLayerIntegrationTests(
        string dataProvider,
        string connectionString)
    {
        ...
    }
}

Je me suis souvent demandé quelle était la nécessité de [TestFixtureSetUp] , étant donné qu'il existe une construction de langage simple, bien comprise et de première classe qui fait exactement la même chose.

Je préfère utiliser des constructeurs pour tirer parti du mot clé en lecture seule garantissant que les variables de membre ne peuvent pas être réinitialisées.

Il existe une différence entre le constructeur et la méthode marquée avec l'attribut [TestFixtureSetUp] . Selon la documentation NUnit:

  

Il est recommandé que le constructeur n'ait aucun effet secondaire, car NUnit peut construire l'objet plusieurs fois au cours d'une session.

Donc, si vous avez une initialisation coûteuse, il vaut mieux utiliser TestFixtureSetUp .

[TestFixtureSetUp] et [TestFixtureTearDown] correspondent à l'ensemble de la classe de test. ne fonctionne qu'une fois.

[Configuration] et [TearDown] s'appliquent à chaque méthode de test (test). fonctionne pour chaque test.

Une différence importante entre constructor et TestFixtureSetUp réside dans le fait que, dans NUnit 2 au moins, le code constructeur est réellement exécuté lors de l'énumération de test, pas uniquement lors de l'exécution d'un test. . Tout ce qui provoque des effets secondaires ou fait un travail réel doit être enveloppé dans un Lazy ou effectué dans TestFixtureSetUp / OneTimeSetUp. Ainsi, vous pouvez considérer le constructeur uniquement comme un endroit pour configurer le test. Alors que TestFixtureSetUp est l'endroit où le dispositif de test, l'état initial requis du système avant l'exécution des tests, est initialisé.

Je pense avoir une bonne réponse négative. Si vous avez un héritage entre les classes de test, utilisez un constructeur à la place de l'attribut.

Une seule méthode annotée avec [TestFixtureSetup] sera appelée (sur la classe concrète uniquement), mais pas les autres initialiseurs de projecteurs. Dans ce cas, je préférerais mettre l'initialisation dans le constructeur, qui possède une sémantique bien définie pour l'héritage:)

Le constructeur et les méthodes SetUp sont utilisés différemment:
Le constructeur est exécuté une seule fois.
Cependant, les méthodes SetUp sont exécutées plusieurs fois, avant l'exécution de chaque scénario de test.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top