2016-12-14 2 views

Antwort

0

Ich würde davon ausgehen, dass Sie nach dem obigen Szenario auf die PIN innerhalb der Datenbank zugreifen können. In diesem Fall würde ich dem Szenario, das die PIN tatsächlich generiert und bestätigt, einen weiteren Schritt hinzufügen. An diesem Punkt können Sie die PIN in einer lokalen Variablen speichern und sie dann im nächsten Szenario verwenden.

So Ihr erstes Szenario würde wie folgt aussehen:

Get generate PIN page 
Enter user name 
Enter password 
Click on submit button 
Confirm PIN number in database 

Der letzte Schritt wäre nicht innerhalb von Selen, sondern über einen API-Aufruf oder andere Mittel erfolgen, um die PIN aus der Datenbank zu erwerben. Es würde die PIN (z. B. regex=/^\d{4}$/) bestätigen und dann in einer lokalen Variablen speichern, sagen wir etwas wie @customer_pin (vorausgesetzt, Sie verwenden Ruby).

Ihr nächstes Szenario wäre in etwa so beginnen:

Get generate login page 
Enter customer ID 
Enter customer PIN 
etc 

Wenn Sie die „Kunden-PIN eingeben“ Hit Schritt, ziehen Sie es aus dem lokal gespeicherten Variablen (@customer_pin).

Mein Rat ist, dass Sie bei der Ausführung dieses zweiten Szenarios bestätigen, dass Sie eine gültige PIN in Ihrer lokal gespeicherten Variablen haben, falls jemand dieses Szenario nicht in der richtigen Reihenfolge ausführen sollte. Sie können dies tun, indem Sie eine globale Variable und einen „Vorher“ Haken in Ihrer features/support/env.rb Datei wie folgt ausgeführt werden:

In diesem Fall
Before do 
    $dunit ||= false 
    return if $dunit 
    $customer_pin = nil 
    $dunit = true 
end 

, verwende ich $customer_pin statt @customer_pin, um die Variable global zugänglich zu machen. Dann würde nach dem Ausführen Ihres ersten Szenarios $customer_pin einem legitimen Wert zugewiesen werden, damit es in beliebigen nachfolgenden Szenarios verwendet werden kann. Nachfolgende Szenarien würden den Regex-Ausdruck verwenden, um zu bestätigen, dass er einen legitimen Wert hat, und eine Ausnahme auslösen/werfen, falls dies nicht der Fall ist.

+0

Ihr Vorschlag basiert auf der Ausführungsreihenfolge von Szenarien und basiert auf dem Erfolg eines Szenarios. Ich rate davon ab, eine Ausführungsorder anzunehmen und von anderen Szenarien einen Erfolg zu erwarten. Es ist ein bekanntes Anti-Muster. –

+0

Im Allgemeinen stimme ich zu, aber wie die meisten Dinge im Leben ... es kommt darauf an. Der obige Fall kann ein schlechtes Beispiel für eine gute Ausrede sein, um ein Programmierungsmuster zu brechen, so dass Ihre Bedenken gut aufgenommen werden. Aber manchmal bremse ich Muster im Geiste des größeren Guten. Beispielsweise kann das Ausführen kleinerer Tests als Sprungbrett für größere Tests zweckmäßiger und weniger invasiv sein als das Wiederholen der Hintergrundeinstellungen für jeden Test. –

0

Ich würde Ihr Problem in zwei teilen.

Eine, die die Stiftgenerierung überprüft, da dies für Ihre Stakeholder wichtig sein kann.

Eine, die eine Hintertür implementiert, um andere Fälle zu unterstützen, in denen eine gültige PIN benötigt wird. Vielleicht eine API, die eine gültige PIN-Nummer generieren oder abrufen kann. Vielleicht erstellen und speichern Sie die PIN in der Datenbank, ohne das System von außen zu berühren. Ich würde auf diese Weise eine PIN abrufen, wenn ich eine gültige PIN für andere Szenarien benötige.

Die technische Lösung, wie man eine gültige PIN erhält, ist nicht so wichtig. Wichtig ist, die Ausführungsreihenfolge der Szenarien zu entkoppeln. Die Ausführungsreihenfolge der Szenarien ist nicht definiert. Jedes Szenario muss isoliert und in zufälliger Reihenfolge ausgeführt werden können.

Kopplungsszenarien ist ein bekanntes Anti-Muster beschrieben here und here.

Verwandte Themen