Domanda

Per impostazione predefinita, cerca le definizioni dei passaggi nel file denominato FeatureContext (tutti i passaggi in un file).
Avendo molti passaggi, è difficile mantenere un file così grande.

Mi piacerebbe avere un file di definizione per file di caratteristiche.

Come posso avere le definizioni dei passaggi nei file esterni?

ad es.

homepage.feature
HomepageContext extends FeatureContext
È stato utile?

Soluzione

Usa l'ereditarietà delle classi e contesti separati.

# /features/contexts/
AbstractContext extends BehatContext {}
FeaturenameContext extends AbstractContext {}

Quindi in /feature/FeatureContext.php importa i file di contesto:

/**
 * Initializes context.
 * Every scenario gets it's own context object.
 *
 * @param array $parameters context parameters (set up via behat.yml)
 */
public function __construct(array $parameters) {

    // import all context classes from context directory, except the abstract one

    $filesToSkip = array('AbstractContext.php');

    $path = dirname(__FILE__) . '/../contexts/';
    $it = new RecursiveDirectoryIterator($path);
    /** @var $file  SplFileInfo */
    foreach ($it as $file) {
        if (!$file->isDir()) {
           $name = $file->getFilename();
           if (!in_array($name, $filesToSkip)) {
               $class = pathinfo($name, PATHINFO_FILENAME);
               require_once dirname(__FILE__) . '/../context/' . $name;
               $this->useContext($class, new $class($parameters));
           }
        }
    }
}

Altri suggerimenti

Behat ha più opzioni per suddividere il tuo FeatureContext in più classi. Innanzitutto, puoi utilizzare l'ereditarietà php5 della vecchia scuola. Se l'ereditarietà non è quella che desideri, Behat supporta anche i sottocontesti: " Uso dei sottocontesti ".

Successivamente, se desideri denominare la classe in modo diverso da FeatureContext, puoi ridefinirlo in " Configurazione contesto " del file di configurazione behat.yml.

In questo modo, è possibile suddividere definizioni e hook comuni in classi separate e utilizzarli anche in altre suite di funzionalità con il sottocontesto o l'ereditarietà.

Ma la tua domanda chiede anche:

Mi piacerebbe avere un file di definizione per file di caratteristiche.

Questa richiesta è completamente sbagliata. Behat and Scenario BDD riguarda la descrizione del comportamento dell'applicazione in termini di business e la creazione di un dizionario di test per i comportamenti descritti. Tenendo presente questo, logicamente non potresti avere più dizionari diversi per un set di funzionalità. Scrivendo le definizioni dei passaggi, stai dicendo a Behat cosa significa quel Given I am on "/news". E quando vuoi che quel passaggio abbia un significato diverso da funzionalità a funzionalità, stai sbagliando.

Behat consiste di 2 concetti principali e abbastanza separati:

  1. file *.feature, scritti in linguaggio Gherkin. Questi file dovrebbero essere auto-descrittivi. Significa che dovrebbero fornire tutte le informazioni al lettore per comprenderle. Gherkin non è un nuovo linguaggio di programmazione per i tuoi test funzionali, è solo un ribasso per le tue storie utente!
  2. FeatureContext.php, descrive come Behat dovrebbe testare le tue funzionalità. Definisce il dizionario dell'intera applicazione da utilizzare con l'intera suite di funzionalità dell'applicazione. Si tratta di un ponte di programmazione tra le tue esperienze utente tipo markdown e i test funzionali effettivi.

E non dovresti rovinare le cose. La suite di funzionalità singole dovrebbe avere un dizionario a passaggi singoli (definizioni). Ma puoi usare un singolo dizionario in più di una suite di funzionalità grazie all'ereditarietà e ai sottocontesti. E sì, puoi dividere il dizionario di una singola suite in più classi php ;-)

Una soluzione è la riutilizzabilità orizzontale con sottocontesti.Utilizza un sottocontesto per ogni "gruppo di funzionalità".

class FeatureContext extends BehatContext
{

    public function __construct(array $context_parameters)
    {
        $this->useContext('math_context', new MathContext());
        $this->useContext('bash_context', new BashContext());
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top