web-dev-qa-db-fra.com

Classe/méthode/propriété statique dans le test unitaire, arrêtez ou non

Mettre à jour

une classe/méthode/propriété statique doit-elle être utilisée dans un environnement de développement de tests unitaires, dans la mesure où il n’est pas possible de le tester sans introduire un wrapper non testable?

Un autre scénario est que, lorsque les membres statiques sont utilisés dans la cible testée, le membre statique ne peut pas être simulé. Ainsi, vous devez tester les valeurs statiques lorsque la cible testée par l’unité est testée. Vous souhaitez l'isoler lorsque le membre statique effectue un calcul.

18
Pingpong

Tester une méthode statique n'est pas différent de tester une autre méthode. Avoir une méthode statique en tant que dépendance à l'intérieur d'un autre module testé pose des problèmes (comme il a été mentionné précédemment - vous ne pouvez pas vous moquer de lui avec des outils gratuits). Mais si la méthode statique elle-même est testée par unité, vous pouvez simplement la traiter comme un composant fiable et fonctionnel

Globalement, il n'y a rien de mal (comme dans, cela ne perturbe pas les tests unitaires/TDD) avec les méthodes statiques lorsque:

  • c'est simple, méthode entrée-sortie (toutes sortes de "calcule ceci étant donné que")
  • il est fiable, par ce que nous entendons par là, il est soit testé par votre appareil, soit par une source tierce que vous considérez comme fiable (par exemple, Math.Floor pourrait être considéré comme fiable - son utilisation ne devrait pas donner lieu à "Attention! , c’est statique! " avertissement; on peut supposer que Microsoft fait son travail)

Quand les méthodes statiques vont causer des problèmes et doivent être évitées? Fondamentalement seulement quand ils interagissent avec / font quelque chose que vous ne pouvez pas contrôler (ou simulacre):

  • tout type de système de fichiers, base de données, dépendances de réseau
  • autres méthodes statiques (peut-être plus complexes) appelées de l'intérieur
  • à peu près tout ce que votre cadre moqueur ne peut pas traiter à des conditions normales

Edit: deux exemples sur la méthode statique will rend les tests unitaires difficiles

1

public int ExtractSumFromReport(string reportPath)
{
     var reportFile = File.ReadAllText(reportPath);
     // ...
}

Comment traitez-vous avec File.ReadAllText? Cela ira évidemment au système de fichiers pour récupérer le contenu du fichier, ce qui est majeur non-non lors des tests unitaires. Ceci est un exemple de méthode statique avec dépendance externe. Pour éviter cela, vous créez généralement un wrapper autour d'une API de système de fichiers ou vous l'injectez simplement en tant que dépendance/délégué. 

2

public void SaveUser(User user)
{
    var session = SessionFactory.CreateSession();
    // ...
}

Et ça? La session est une dépendance non triviale. Bien sûr, cela peut prendre la forme ISession, mais comment forcer SessionFactory à revenir en riant? Nous ne pouvons pas Et nous ne pouvons pas non plus créer facile à déterminer objet de session. 

Dans les cas ci-dessus, il est préférable d'éviter les méthodes statiques.

40
k.m

Les méthodes statiquesPEUVENTêtre testées à l’unité. On ne peut pas se moquer de eux (généralement; il existe des cadres pour faire cela comme Moles .

3
serge.karalenka

Vous ne pouvez pas vous moquer des méthodes/propriétés statiques. Ainsi, lorsque votre classA utilise un membre statique de classB, vous ne pouvez pas tester classA de manière isolée.

UPDATE: Je ne vois aucun problème à intégrer une classe statique dans un objet. Cela ne prend pas beaucoup de temps, mais cela vous permet de réduire le couplage dans votre système.

1

Techniquement, vous pouvez simulez la méthode statique en Java avec PowerMock , mais si vous devez le faire, je recommanderais sérieusement de refactoriser votre code. Je pense que les méthodes statiques devraient toujours être private et utilisées uniquement à l'intérieur des classes dans lesquelles elles sont définies, à des fins internes. Je considère la méthode statique exposée publiquement comme une odeur de code .

0
yegor256

Je trouve cette menace quel que soit le langage de programmation, mais comme ma vie quotidienne est liée à PHP, voici une bonne ressource pour gérer les méthodes statiques sur PHP http://docs.mockery.io/fr /latest/reference/public_static_properties.html

0
Rozkalns