web-dev-qa-db-fra.com

RSpec: décrire, contexte, fonctionnalité, scénario?

describe, context, feature, scenario: Quelle est la différence entre les quatre et quand dois-je les utiliser?

98
mikeglaz

context est un alias pour describe, ils sont donc fonctionnellement équivalents. Vous pouvez les utiliser de manière interchangeable, la seule différence est la lecture de votre fichier de spécifications. Il n'y a pas de différence de sortie de test par exemple. Le livre RSpec dit:

"Nous avons tendance à utiliser describe() pour les choses et context() pour le contexte".

Personnellement, j'aime utiliser describe, mais je peux voir pourquoi les gens préfèrent context.

feature et scenario font partie de Capybara, et non RSpec, et sont destinés à être utilisés pour les tests d'acceptation. feature est équivalent à describe/context et scenario équivalent à it/example.

Si vous écrivez des tests d'acceptation avec Capybara, utilisez la syntaxe feature/scenario, sinon utilisez la syntaxe describe/it.

131
Sam Peacey

Ce matin, en écrivant quelques spécifications, j'avais la même question. Habituellement, j'utilise principalement describe et je n'y pense pas particulièrement, mais ce matin, je faisais face à de nombreux cas et différentes spécifications pour un module, donc cela devait être facilement compréhensible pour le prochain développeur qui le fera. lire ces spécifications. J'ai donc demandé à Google à ce sujet, et j'ai trouvé ceci: décrire vs contexte dans rspec , dont je trouve la réponse assez intéressante:

Selon le code source de rspec, "contexte" est juste une méthode d'alias de "décrire", ce qui signifie qu'il n'y a pas de différence fonctionnelle entre ces deux méthodes. Cependant, il existe une différence contextuelle qui contribuera à rendre vos tests plus compréhensibles en utilisant les deux.

Le but de "décrire" est d'encapsuler un ensemble de tests par rapport à une fonctionnalité tandis que "contexte" est d'envelopper un ensemble de tests par rapport à une fonctionnalité sous le même état.

Donc, en vous appuyant sur ce principe, vous écririez une spécification comme celle-ci:

#
# The feature/behaviour I'm currently testing
#
describe "item ordering" do

  # 1st state of the feature/behaviour I'm testing
  context "without a order param" do
    ...
  end

  # 2nd state of the feature/behaviour I'm testing
  context "with a given order column" do
    ..
  end

  # Last state of the feature/behaviour I'm testing
  context "with a given order column + reverse" do
    ..
  end
end

Je ne sais pas s'il s'agit d'une règle généralement acceptée, mais je trouve cette approche claire et assez facile à comprendre.

30

Développer sur Pierre excellente réponse , selon aux docs :

La fonctionnalité et le scénario DSL correspondent à décrire et à lui, respectivement. Ces méthodes sont simplement des alias qui permettent aux spécifications de fonctionnalités de lire davantage en tant que tests de client et d'acceptation.

Donc, pour ceux qui connaissent les termes Mocha et qui le décrivent (qui sont mieux adaptés pour décrire le comportement d'un test du point de vue d'un utilisateur, donc Mocha fonctionnant principalement comme un cadre de test frontal), vous pourriez:

  • choisissez de toujours utiliser uniquement describe et it ou un autre couplage
  • choisissez d'utiliser it à l'intérieur d'un bloc context qui nécessite plusieurs assertions/tests dans un état d'application spécifique

En optant pour la deuxième option, vous pouvez toujours suivre l'intention de "... envelopper [ping] un ensemble de tests contre une fonctionnalité sous le même état".

Ainsi, vos tests pourraient ressembler à ceci:

#
# The feature/behaviour I'm currently testing
#
describe "item ordering" do

  # 1st state of the feature/behaviour I'm testing
  context "without an order param" do
    # 1st and only test we want to run in this state
    it "asks the user for missing order param" do
     ...
    end
  end

  # 2nd state of the feature/behaviour I'm testing
  context "with an invalid order param" do
    # 1st test we want to run in this state
    it "validates and rejects order param" do
      ...
    end
    # 2nd test we want to run in this state
    it "returns an error to user" do
      ...
    end
  end

  # 3rd state of the feature/behaviour I'm testing with multiple tests
  context "with a valid order param" do
    it "validates and accepts order param" do
      ...
    end
    it "displays correct price for order" do
      ...
    end
    unless being_audited
      it "secretly charges higher price to user" do
        ...
      end
    end
  end
end

De cette façon, vous ignorez complètement le mot clé feature, que vous voudrez peut-être utiliser pour des fonctionnalités frontales spécifiques ou si vous faites du FDD (développement piloté par les fonctionnalités), ce qui peut être inconfortable pour certains. Demandez à votre équipe de développeurs de vous renseigner ici.

Mise en garde: ne suivez pas toujours les normes de l'industrie, imaginez si nous modélisons tous nos tests d'après la philosophie Volkswagen?

0
GrayedFox