RSpec: beschreiben, Kontext, Funktion, Szenario?


112

describe, context, feature, scenario: Was ist der Unterschied (n) unter den vier und wann verwende ich jeden?

Antworten:


148

Das contextist ein Alias ​​für describe, daher sind sie funktional gleichwertig. Sie können sie austauschbar verwenden. Der einzige Unterschied besteht darin, wie Ihre Spezifikationsdatei gelesen wird. Es gibt zum Beispiel keinen Unterschied in der Testausgabe. Das RSpec-Buch sagt:

"Wir neigen dazu, describe()für Dinge und context()für den Kontext zu verwenden".

Persönlich benutze ich gerne describe, aber ich kann sehen, warum die Leute es vorziehen context.

featureund scenariosind ein Teil von Capybara und nicht von RSpec und sollen für Abnahmetests verwendet werden. featureist äquivalent zu describe/ contextund scenarioäquivalent zu it/ example.

Wenn Sie Abnahmetests mit Capybara schreiben, verwenden Sie die Syntax feature/ scenario, wenn nicht die Syntax describe/ it.


1
Sam ist auf den Punkt gebracht und hier ist ein Link mit mehr Details und hervorragenden Beispielen, speziell zu dem Abschnitt für Capybaras eingebaute DSL (Domain Specific Language): github.com/jnicklas/capybara#using-capybara-with-rspec
SpartaSixZero

36

Als ich heute Morgen einige Spezifikationen schrieb, hatte ich die gleiche Frage. Normalerweise benutze ich das hauptsächlich describeund denke nicht besonders darüber nach, aber heute Morgen habe ich mich mit vielen Fällen und unterschiedlichen Spezifikationen für ein Modul befasst, sodass es für den nächsten Entwickler, der diese Spezifikationen lesen wird, leicht verständlich sein musste. Also habe ich Google danach gefragt und Folgendes gefunden: beschreiben vs. Kontext in rspec , dessen Antwort ich ziemlich interessant finde:

Laut dem rspec-Quellcode ist „Kontext“ nur eine Alias-Methode für „Beschreiben“, was bedeutet, dass zwischen diesen beiden Methoden kein funktionaler Unterschied besteht. Es gibt jedoch einen kontextbezogenen Unterschied, der dazu beiträgt, Ihre Tests verständlicher zu machen, indem Sie beide verwenden.

Der Zweck von "beschreiben" besteht darin, eine Reihe von Tests gegen eine Funktionalität zu verpacken, während "Kontext" darin besteht, eine Reihe von Tests gegen eine Funktionalität unter demselben Status zu verpacken.

Wenn Sie sich also auf dieses Prinzip verlassen, würden Sie eine Spezifikation wie diese schreiben:

#
# 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

Ich bin mir nicht sicher, ob dies eine allgemein akzeptierte Regel ist, aber ich finde diesen Ansatz klar und leicht zu verstehen.


1
Dies ist eine sehr gute Antwort für Beschreibung / Kontext. Aber Sie haben die andere Hälfte der Frage zu Feature / Szenario vergessen - ich denke jedoch, dass sie genau so verwendet werden können (und sollten), wie Sie es für Beschreibung / Kontext angegeben haben.
rmcsharry

Wäre toll, wenn Sie dies mit einer Erklärung der Funktion / des Szenarios erweitern würden!
GrayedFox

0

Erweiterung der ausgezeichneten Antwort von Pierre laut den Dokumenten :

Die Funktion und das Szenario DSL entsprechen der Beschreibung bzw. der Beschreibung. Diese Methoden sind einfach Aliase, mit denen Feature-Spezifikationen als Kunden- und Abnahmetests mehr gelesen werden können.

Für diejenigen, die mit den Mocha-Begriffen vertraut sind und diese beschreiben (die besser geeignet sind, das Verhalten eines Tests aus der Sicht eines Benutzers zu beschreiben, daher fungiert Mocha hauptsächlich als Front-End-Test-Framework), könnten Sie:

  • Wählen Sie immer und nur describeund itoder eine andere Paarung
  • Wählen Sie die Verwendung itinnerhalb eines contextBlocks, für den mehrere Zusicherungen / Tests in einem bestimmten App-Status erforderlich sind

Wenn Sie sich für die zweite Option entscheiden, können Sie weiterhin der Absicht folgen, "... eine Reihe von Tests für eine Funktionalität unter demselben Status zu pingen".

So könnten Ihre Tests folgendermaßen aussehen:

#
# 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

Auf diese Weise überspringen Sie das featureSchlüsselwort vollständig, das Sie möglicherweise für bestimmte Front-End-Funktionen verwenden möchten, oder wenn Sie FDD (Feature Driven Development) ausführen, was für einige möglicherweise unangenehm ist. Fragen Sie hier Ihr Entwicklerteam nach Eingaben.

Vorsichtsmaßnahme: Befolgen Sie nicht immer die Industriestandards. Stellen Sie sich vor, wir hätten alle unsere Tests nach der Volkswagen-Philosophie modelliert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.