web-dev-qa-db-fra.com

Configuration VS Constructeur dans l'appareil de test

Pourquoi un appareil de test a-t-il une méthode de configuration dans Google Test? Le constructeur n'est-il pas efficacement la même chose? De même pour la méthode de la déchirure. Les appels vers la configuration et le constructeur, ainsi que le dératrement et le destructeur, sont compatibles avec les testsEventListeners: OntesStStart et Ontestend.

33
Baz

Il y a ne réponse à cela dans la FAQ :

Devrais-je utiliser le constructeur/destructeur de l'appareil de test ou la fonction de configuration/détriment?

La première chose à retenir est que Googletest fait non réutiliser le même objet de fixation de test sur plusieurs tests. Pour chaque TEST_F, Googletest créera A frais objet de test de test, appelez immédiatement SetUp(), exécutez l'organisme de test, appelez TearDown(), et Ensuite, supprimez l'objet de test de test.

Lorsque vous devez écrire une configuration et une logique de démarrage par test, vous avez le choix entre utiliser le constructeur/destructeur de test de test ou SetUp()/TearDown(). Le premier est généralement préféré, car il présente les avantages suivants:

  • En initialisant une variable de membre dans le constructeur, nous avons la possibilité de le faire const, qui aide à prévenir les modifications accidentelles de sa valeur et que les tests sont plus évidemment corrects.
  • Dans le cas où nous devions sous-classer la classe de fixation du test, le constructeur de la sous-classe est garanti d'appeler le constructeur de la classe de base premier et le destructeur de sous-classe est garanti d'appeler la classe de base 'Destructor = après. Avec SetUp()/TearDown(), une sous-classe peut commettre l'erreur d'oublier d'appeler la classe de base 'SetUp()/TearDown() ou les appelez au mauvais moment.

Vous pouvez toujours utiliser SetUp()/TearDown() dans les cas rares suivants:

  • Dans le corps d'un constructeur (ou destructeur), il n'est pas possible d'utiliser les macros ASSERT_xx. Par conséquent, si l'opération de configuration pourrait entraîner une défaillance de test fatale qui devrait empêcher le test d'exécuter, il est nécessaire d'utiliser une macro CHECK ou d'utiliser SetUp() au lieu d'un constructeur.
  • Si l'opération de démolition pouvait lancer une exception, vous devez utiliser TearDown() par opposition au destructeur, car le lancer dans un destructeur conduit à un comportement indéfini et va généralement tuer votre programme immédiatement. Notez que de nombreuses bibliothèques standard (comme STL) peuvent lancer lorsque des exceptions sont activées dans le compilateur. Par conséquent, vous devez préférer TearDown() si vous souhaitez écrire des tests portables qui fonctionnent avec ou sans exceptions.
  • L'équipe GOOGLETEST envisage de faire des plateformes de macros d'affirmation sur les plates-formes où des exceptions sont activées (par exemple, le côté client Windows, Mac OS et Linux), qui éliminera la nécessité pour l'utilisateur de propager des défaillances d'un sous-programme à son appelant. Par conséquent, vous ne devriez pas utiliser les assertions GoogletTest dans un destructeur si votre code pourrait fonctionner sur une telle plate-forme.
  • Dans un constructeur ou destructeur, vous ne pouvez pas faire appel à une fonction virtuelle sur cet objet. (Vous pouvez appeler une méthode déclarée comme virtuelle, mais elle sera statiquement liée.) Par conséquent, si vous devez appeler une méthode qui sera remplacée dans une classe dérivée, vous devez utiliser SetUp()/TearDown().
38
Kiril