Perché pensi che BDD e test di integrazione sono diversi?
BDD significa semplicemente guidare il design attraverso il comportamento desiderato, solitamente espresso attraverso una serie di test di accettazione.
Questi test possono essere "test di integrazione" che coinvolgono molti [micro] servizi o possono essere test che specificano il comportamento desiderato di un singolo servizio o una singola classe in quel servizio. Idealmente ci sarà un mix di test a tutti questi livelli. L'importante è che tu specifichi il comportamento che vuoi e usalo per guidare lo sviluppo.
Il modo in cui il sistema viene implementato è, in una certa misura, irrilevante a condizione che mostri il comportamento previsto. Per i test di alto livello che trattano il sistema come una scatola nera, questo è vero e meno si va e più si avvicina al codice effettivo questo diventa meno vero (come si sta effettivamente testando l'implementazione in quel punto).
Quindi vorrei concentrarmi sul comportamento previsto dalle nuove funzionalità e scrivere le specifiche per questi test di accettazione, quindi implementare i servizi per soddisfare il comportamento richiesto aggiungendo test di livello inferiore secondo necessità in modo pragmatico, tenendo presente che Più basso è il livello dei test, più è probabile che siano fragili e che sia necessario modificarli mentre modifichi la tua implementazione.
EDIT
Basato sulla sua domanda di modifica.
Non sono d'accordo che i test BDD dovrebbero testare solo la logica di business. In effetti, è normale che i test BDD siano più focalizzati sulla verifica del sistema nel suo complesso, con tutte le parti integrate insieme. Detto questo, il BDD è solo uno stile di test che specifica il comportamento desiderato e può essere applicato a qualsiasi livello dell'applicazione. È possibile testare una singola classe specificando il comportamento usando la sintassi Gherkin e talvolta lo facciamo. specifichiamo anche il comportamento previsto dell'intero sistema utilizzando Gherkin e il comportamento previsto dei nostri servizi individualmente. Questi test saranno naturalmente in un formato leggermente diverso a seconda del livello che stiamo prendendo di mira.
Per i test di sistema potremmo avere specifiche in questo modo:
Scenario: user can perform action A
Given I am a user with access to some feature A
And feature A is enabled for the user
When I call perform action A with parameters 'Bob' and 'John'
Then A 'BobJohn' is created
And notifications are sent to the current user
per i singoli servizi che potremmo avere prove come
Scenario: create messages are handled correctly
Given the service is set up
When a message arrives to create a 'BobJohn'
Then a new entry is added to the database with the key 'BobJohn'
And an outgoing notification message for 'BobJohn' is created
Per singole classi potremmo avere prove come
Scenario: Notifier class should send notifications via all users preferred means
Given the current user wants notification by Twitter
And the current user who wants notification by email
When I send the notification 'BobJohn' to the current user
Then the twitter notifier should be invoked with 'BobJohn'
And the email notifier should be invoked with 'BobJohn'
Questi sono tutti test in stile BDD ma testano aspetti diversi del sistema tem.
L'autore di BDD in Action pensa che siano compatibili: http://www.slideshare.net/wakaleo/bdddriven-microservices – ngm
Grazie per averlo notato. Ho appena letto alcuni articoli scritti da JF Smart, condividiamo le stesse opinioni su quella domanda. Dice che sono compatibili nelle diverse fasi degli sviluppi. Se l'architettura della soluzione lo rende possibile (spero che un'architettura di discesa lo renda possibile), BDD si adatta in modo ottimale ai test di accettazione commerciale. Una volta che i test di accettazione sono OK, i test di integrazione mirano a testare la soluzione contro un'infrastruttura di destinazione. Separazione degli interessi. Egli sostiene che respingere le impostazioni predefinite di accettazione per gli sviluppatori dai test di integrazione è una perdita di tempo. Compatibile, ma non uguale. –