6
votes

Existe-t-il un moyen de protéger les noms de test de l'unité qui suit MethodName_condition_ExpectedbehavIour motif contre le refactoring?

Je suis la convention de dénomination de

MethodName_condition_Expectedbehaviour strong> p> blockquote>

En ce qui concerne la nommage de mes tests de l'unité qui testent des méthodes spécifiques. P>

Par exemple: P>

[TestMethod]
public void GetCity_TakesParidId_ReturnsParis(){...}


2 commentaires

Comment est-ce lié à Java? La balise Java doit être supprimée parmi les balises. Quoi qu'il en soit, en Java (avec JUnit, par exemple), si vous écrivez un test pour une méthode spécifique, il n'y aura aucune connexion entre le test et la méthode sous test et Eclipse, Netbeans, etc. ne vous proposera pas de refactoriser le nom de la méthode de test. . Je ne peux pas commenter le comportement de Restomer.


"Changer le nom de la méthode" est-il un gros cas pour vous? Si c'est le cas .. peut-être que vous pouvez omettre ce changement-aimant de vos noms de test. Par exemple. [Classe] TestCityRepository a la méthode de test de la méthode de test. De cette façon, vous êtes isolé du nom de la méthode de mise en œuvre ..


4 Réponses :


1
votes

J'ai aussi commencé avec cette conversion, cependant, a fini avec sentiment qui n'est pas très bon. Maintenant, j'utilise des noms de style BDD comme devoir_return_paris_for_parisid .

Cela rend mes tests plus lisibles et ALSOW me permet de refacturer les noms de méthode sans vous soucier de mes tests :)


4 commentaires

Donc, vous ne mentionnez pas le nom de la méthode du nom de test unitaire?


Non, cela me permet de le renommer plus tard sans que ce soit de côté :) Je pense que je teste des scénarios, pas des méthodes particulières


Peut-être que votre chemin peut être connecté avec un commentaire comme: méthode dans Test: GetCity. Donc, que Resharper proposera de renommer ce texte lorsque vous renommez votre méthode.


Peut-être, mais encore une fois, je pense que ce nom de méthode n'est pas essentiel.



0
votes

Je pense que la clé ici est ce que vous devrait être devoir tester.

Vous avez mentionné TDD dans les balises, j'espère donc que nous essayons d'adhérer à cela ici. Par ce paradigme, les tests que vous écrivez ont deux objectifs:

  1. à Soutenez votre code une fois qu'il est écrit, vous pouvez donc refroidir sans craindre que vous n'aviez cassé quelque chose

  2. à nous guider à une meilleure façon de concevoir des composants - écrire un test d'abord vous oblige vraiment à penser à ce qui est nécessaire pour résoudre le problème à la main.

    Je sais au début, il semble que cette question concerne le premier point, mais je pense vraiment que c'est à peu près la seconde. Le problème que vous rencontrez est que vous avez des composants concrets que vous testez au lieu d'un contrat.

    en termes de code, cela signifie que je pense que nous devrions tester des interfaces au lieu des méthodes de classe, car Sinon, nous exposons notre test à une variété de problèmes associés à des tests Composants au lieu de contrats - stratégies d'héritage, construction d'objets et ici, renommage.

    Il est vrai que les noms d'interfaces changeront également, mais ils seront beaucoup plus rigides que les noms de méthodes. Ce que TDD nous donne ici n'est pas simplement un moyen de soutenir le changement à travers un harnais de test - il fournit la perspicacité de réaliser que nous pourrions y aller dans la mauvaise voie!

    prenez par exemple le bloc de code que vous avez donné : xxx

    et disons que nous testons la méthode getcity () sur notre objet, CityObtainer - Quand a fait J'ai mis cet objet vers le haut? Pourquoi ai-je fini? Si je réalise getMatchingCity () est un meilleur nom, vous avez le problème décrit ci-dessus!

    La solution que je propose, c'est que nous pensons vraiment que cette méthode signifie vraiment < em> plus tôt dans le processus, en utilisant des interfaces: xxx

    en écrivant de ce type de style "extérieur", nous sommes obligés de penser à Ce que nous voulons de l'objet beaucoup plus tôt dans le processus, et cela devient l'accent sur la réduction de sa volatilité. Cela n'élimine pas votre problème, mais cela peut l'atténuer quelque peu (et je pense que c'est une meilleure approche de toute façon).

    Idéalement, nous allons plus loin, et nous pas même écrire n'importe quel code avant de commencer le test: xxx

    De cette façon, je peux voir ce que je veux vraiment veux du composant avant de Même commencer à écrire - si getcity () n'est pas vraiment ce que je veux, mais plutôt getcitybyid () , il deviendrait évident beaucoup plus tôt dans le processus. Comme je l'ai dit ci-dessus, ce n'est pas infaillible, mais cela pourrait réduire la douleur pour ce cas particulier.

    Une fois que vous avez traversé cela, je sens que si vous changez le nom de la méthode, c'est parce que vous êtes modifier les termes du contrat , et cela signifie que vous devez doit revenir en arrière et reconsidérer le test (car il est possible que vous n'ayez pas vouloir le changer).

    (comme un addenda rapide, si nous écrivons un test avec TDD à l'esprit, quelque chose se passe à l'intérieur getcity () qui a un important Montant de la logique en cours. En pensant au test comme étant à un contrat nous aide à séparer l'intention de la mise en œuvre - le test restera valide peu importe ce que nous changeons derrière l'interface !)


0 commentaires

7
votes

Un modèle récent consiste à des tests de groupes dans les classes intérieures par la méthode qu'ils testent.

Par exemple (Omettre des attributs de test): xxx

voir Tests d'unité de structuration du blog de Phil Haack pour plus de détails. < p> La chose nette à propos de cette mise en page est que, lorsque le nom de la méthode change, Vous ne devrez que changer le nom de la classe intérieure au lieu de tous les tests individuels.


1 commentaires

J'aime vraiment l'idée! Où avez-vous appris cette tendance à la manière? Toute ressource ou un article ou ...? (Merci!)



0
votes

Je suis en retard, mais peut-être que cela peut être toujours utile. C'est ma solution (en supposant que vous utilisez Xunit au moins au moins).

Créez d'abord un attribut Facture qui étend le fait Xunit. P>

public class A
{
    public int Just2() => 2;
}

public class ATests
{
    [FactFor(nameof(A.Just2))]
    public void Should_Return2()
    {
        var a = new A();
        a.Just2().Should().Be(2);
    }
}


0 commentaires