Comments (17)
Este comportamento é esperado. Os arquivos dentro de uma execução são executados uma unica vez, os cenários podem sim ser executados quantas vezes quiser.
Neste seu exemplo será necessário chamar duas vezes o método run
eng.addStories("/stories/a1.story");
eng.addStories("/stories/a2.story");
eng.run();
eng.addStories("/stories/a1.story");
eng.run();
from behave.
Então agora é bug:
Testes ===>
@test
public void testAllStories() throws Throwable {
eng.addStories("/stories/a1.story");
eng.addStories("/stories/a2.story");
eng.run();
eng.addStories("/stories/a1.story");
eng.run();
}
Log ===>
16:01:42,558 INFO (main) [BehaveContext]: --------------------------------
16:01:42,558 INFO (main) [BehaveContext]: Demoiselle Behave Iniciado
16:01:42,558 INFO (main) [BehaveContext]: --------------------------------
16:01:42,612 INFO (main) [JBehaveParser]: Configurando o JBehave
16:01:42,623 INFO (main) [JBehaveParser]: Iniciando o parser JBehave
16:01:42,624 INFO (main) [JBehaveParser]: Executando estorias: [stories/a1.storyConverted, stories/a2.storyConverted]
Processing system properties {}
Using controls EmbedderControls[batch=false,skip=false,generateViewAfterStories=true,ignoreFailureInStories=true,ignoreFailureInView=true,verboseFailures=true,verboseFiltering=false,storyTimeoutInSecs=3600,threads=1]
(BeforeStories)
16:01:42,702 INFO (main) [BeforeAfterSteps]: >>Iniciando Aplicação<<
log4j:WARN No appenders could be found for logger (org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Running story stories/a1.storyConverted
Funcionalidade: Acesso
(stories/a1.storyConverted)
Narrative:
In order to a tela inicial apareceça para mim
As a visitante
I want to acessar o Google
Scenario: Acesso ao Google
Dado que vou para a tela "Tela de Busca"
Então será exibido "Google"
Scenario: Pesquisa Simples
Dado que vou para a tela "Tela de Busca"
Quando informo "Demoiselle Behave" no campo "Campo de Busca"
Então será exibido "https://github.com/demoiselle/behave1/" (FAILED)
(java.lang.AssertionError: Texto não encontrado na tela. Texto: https://github.com/demoiselle/behave1/)
Failed to run story stories/a1.storyConverted
java.lang.AssertionError: Texto não encontrado na tela. Texto: https://github.com/demoiselle/behave1/
at org.junit.Assert.fail(Assert.java:91)
at br.gov.frameworkdemoiselle.behave.runner.webdriver.ui.WebScreen.waitText(WebScreen.java:68)
at br.gov.frameworkdemoiselle.behave.runner.webdriver.ui.WebScreen.waitText(WebScreen.java:52)
at br.gov.frameworkdemoiselle.behave.parser.jbehave.CommonSteps.textVisible(CommonSteps.java:214)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.jbehave.core.steps.StepCreator$ParameterisedStep.perform(StepCreator.java:550)
at org.jbehave.core.embedder.StoryRunner$FineSoFar.run(StoryRunner.java:499)
at org.jbehave.core.embedder.StoryRunner.runStepsWhileKeepingState(StoryRunner.java:479)
at org.jbehave.core.embedder.StoryRunner.runScenarioSteps(StoryRunner.java:443)
at org.jbehave.core.embedder.StoryRunner.runCancellable(StoryRunner.java:305)
at org.jbehave.core.embedder.StoryRunner.run(StoryRunner.java:219)
at org.jbehave.core.embedder.StoryRunner.run(StoryRunner.java:180)
at org.jbehave.core.embedder.StoryManager$EnqueuedStory.call(StoryManager.java:229)
at org.jbehave.core.embedder.StoryManager$EnqueuedStory.call(StoryManager.java:201)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:679)
Running story stories/a2.storyConverted
Funcionalidade: Acesso
(stories/a2.storyConverted)
Narrative:
In order to a tela inicial apareceça para mim
As a visitante
I want to acessar o Google
Scenario: Acesso ao Google2
Dado que vou para a tela "Tela de Busca"
Então será exibido "Google"
Scenario: Pesquisa Simples2
Dado que vou para a tela "Tela de Busca"
Quando informo "Demoiselle Behave" no campo "Campo de Busca"
Então será exibido "https://github.com/demoiselle/behave/"
(AfterStories)
16:02:43,265 INFO (main) [BeforeAfterSteps]: >>Finalizando Aplicação<<
Generating reports view to '/home/01069360503/workspace-dbehave/teste/target/jbehave' using formats '[defaultstoryreport, console, html, stats]' and view properties '{defaultFormats=stats, decorateNonHtml=true, viewDirectory=view, decorated=ftl/jbehave-report-decorated.ftl, reports=ftl/jbehave-reports-with-totals.ftl, maps=ftl/jbehave-maps.ftl, navigator=ftl/jbehave-navigator.ftl, views=ftl/jbehave-views.ftl, nonDecorated=ftl/jbehave-report-non-decorated.ftl}'
Reports view generated with 2 stories (of which 0 pending) containing 4 scenarios (of which 0 pending)
Failures in reports view: 1 scenarios failed
16:02:43,493 INFO (main) [JBehaveParser]: Finalizando parser JBehave
16:02:43,493 INFO (main) [BehaveContext]: --------------------------------
16:02:43,493 INFO (main) [BehaveContext]: Demoiselle Behave Finalizado
16:02:43,494 INFO (main) [BehaveContext]: --------------------------------
Reutilizei uma historia no final e ela não foi executada
from behave.
Tenta assim
ArrayList<String> stories = new ArrayList<String>(); stories.add("/stories/a1.story"); stories.add("/stories/a2.story"); eng.run(stories); stories = new ArrayList<String>(); stories.add("/stories/a1.story"); eng.run(stories);
from behave.
Bug denovo (executei até um "clean")
Testes ===>
@test
public void testAllStories() throws Throwable {
ArrayList stories = new ArrayList();
stories.add("/stories/a1.story");
stories.add("/stories/a2.story");
eng.run(stories);
stories = new ArrayList<String>();
stories.add("/stories/a1.story");
eng.run(stories);
}
Log ===>
16:39:43,184 INFO (main) [BehaveContext]: --------------------------------
16:39:43,184 INFO (main) [BehaveContext]: Demoiselle Behave Iniciado
16:39:43,184 INFO (main) [BehaveContext]: --------------------------------
16:39:43,238 INFO (main) [JBehaveParser]: Configurando o JBehave
16:39:43,250 INFO (main) [JBehaveParser]: Iniciando o parser JBehave
16:39:43,251 INFO (main) [JBehaveParser]: Executando estorias: [stories/a1.storyConverted, stories/a2.storyConverted]
Processing system properties {}
Using controls EmbedderControls[batch=false,skip=false,generateViewAfterStories=true,ignoreFailureInStories=true,ignoreFailureInView=true,verboseFailures=true,verboseFiltering=false,storyTimeoutInSecs=3600,threads=1]
(BeforeStories)
16:39:43,335 INFO (main) [BeforeAfterSteps]: >>Iniciando Aplicação<<
log4j:WARN No appenders could be found for logger (org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Running story stories/a1.storyConverted
Funcionalidade: Acesso
(stories/a1.storyConverted)
Narrative:
In order to a tela inicial apareceça para mim
As a visitante
I want to acessar o Google
Scenario: Acesso ao Google
Dado que vou para a tela "Tela de Busca"
Então será exibido "Google"
Scenario: Pesquisa Simples
Dado que vou para a tela "Tela de Busca"
Quando informo "Demoiselle Behave" no campo "Campo de Busca"
Então será exibido "https://github.com/demoiselle/behave1/" (FAILED)
(java.lang.AssertionError: Texto não encontrado na tela. Texto: https://github.com/demoiselle/behave1/)
Failed to run story stories/a1.storyConverted
java.lang.AssertionError: Texto não encontrado na tela. Texto: https://github.com/demoiselle/behave1/
at org.junit.Assert.fail(Assert.java:91)
at br.gov.frameworkdemoiselle.behave.runner.webdriver.ui.WebScreen.waitText(WebScreen.java:68)
at br.gov.frameworkdemoiselle.behave.runner.webdriver.ui.WebScreen.waitText(WebScreen.java:52)
at br.gov.frameworkdemoiselle.behave.parser.jbehave.CommonSteps.textVisible(CommonSteps.java:214)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.jbehave.core.steps.StepCreator$ParameterisedStep.perform(StepCreator.java:550)
at org.jbehave.core.embedder.StoryRunner$FineSoFar.run(StoryRunner.java:499)
at org.jbehave.core.embedder.StoryRunner.runStepsWhileKeepingState(StoryRunner.java:479)
at org.jbehave.core.embedder.StoryRunner.runScenarioSteps(StoryRunner.java:443)
at org.jbehave.core.embedder.StoryRunner.runCancellable(StoryRunner.java:305)
at org.jbehave.core.embedder.StoryRunner.run(StoryRunner.java:219)
at org.jbehave.core.embedder.StoryRunner.run(StoryRunner.java:180)
at org.jbehave.core.embedder.StoryManager$EnqueuedStory.call(StoryManager.java:229)
at org.jbehave.core.embedder.StoryManager$EnqueuedStory.call(StoryManager.java:201)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:679)
Running story stories/a2.storyConverted
Funcionalidade: Acesso
(stories/a2.storyConverted)
Narrative:
In order to a tela inicial apareceça para mim
As a visitante
I want to acessar o Google
Scenario: Acesso ao Google2
Dado que vou para a tela "Tela de Busca"
Então será exibido "Google"
Scenario: Pesquisa Simples2
Dado que vou para a tela "Tela de Busca"
Quando informo "Demoiselle Behave" no campo "Campo de Busca"
Então será exibido "https://github.com/demoiselle/behave/"
(AfterStories)
16:40:49,197 INFO (main) [BeforeAfterSteps]: >>Finalizando Aplicação<<
Generating reports view to '/home/01069360503/workspace-dbehave/teste/target/jbehave' using formats '[defaultstoryreport, console, html, stats]' and view properties '{defaultFormats=stats, decorateNonHtml=true, viewDirectory=view, decorated=ftl/jbehave-report-decorated.ftl, reports=ftl/jbehave-reports-with-totals.ftl, maps=ftl/jbehave-maps.ftl, navigator=ftl/jbehave-navigator.ftl, views=ftl/jbehave-views.ftl, nonDecorated=ftl/jbehave-report-non-decorated.ftl}'
Reports view generated with 2 stories (of which 0 pending) containing 4 scenarios (of which 0 pending)
Failures in reports view: 1 scenarios failed
16:40:49,424 INFO (main) [JBehaveParser]: Finalizando parser JBehave
16:40:49,424 INFO (main) [BehaveContext]: --------------------------------
16:40:49,424 INFO (main) [BehaveContext]: Demoiselle Behave Finalizado
16:40:49,425 INFO (main) [BehaveContext]: --------------------------------
Reutilizei uma historia no final e ela não foi executada
Salvar as historias anexadas com um novo formato ".txt"
from behave.
Eu não entendi por que você quer executar a mesma história duas vezes. O que tem no a1.story e o que tem no a2.story?
from behave.
De fato não é um cenário típico. Rogério, com você levantou a bola, tente depurar o código e propor uma alternativa.
from behave.
Concordo. De fato não é um cenário típico. Estava tentando lembrar qual a regra para execução e me deparei com este exemplo. Queria ver se diferenciava alguma coisa do caso de usar jbehave puro. Vanderson, vou ver aqui uma alternativa.
from behave.
Marcus, da maneira que o Demoiselle Behave esta projetado, não posso rodar uma "story" duas vezes, entendeu?
Pense assim:
a1.story => produz algo que vai ser consumido, ou seja, deixa o banco de dados da aplicação em um certo estado
a2.story => consome algo, ou seja, modifica o estado da aplicação
E teria um a3.story => verifica se algo foi produzido ou etc...
Ai eu chamaria novamente o a1.story.
Entendeu? (tem alternativas com reuso de cenário não de historia)
Seria algo do tipo depois do a1.story teria que rodar o a2.story e o a3.story em paralelo, a solução simples era repetir a execução do a1.story depois do a2.story, antes de rodar o a3.story.
from behave.
Outra coisa como você acha que vai sair no relatório?
from behave.
corrigido: c5721dc
from behave.
Testes (Demoiselle Behave )===>
1.2.1-SNAPSHOT
@Test
public void testAllStories() throws Throwable {
ArrayList<String> stories = new ArrayList<String>();
stories.add("/a1.story");
stories.add("/a2.story");
stories.add("/a1.story");
stories.add("/a2.story");
eng.run(stories);
}
17:25:33,759 INFO (main) [BehaveContext]: --------------------------------
17:25:33,759 INFO (main) [BehaveContext]: Demoiselle Behave Iniciado
17:25:33,759 INFO (main) [BehaveContext]: --------------------------------
17:25:33,811 INFO (main) [JBehaveParser]: Configurando o JBehave
17:25:33,822 INFO (main) [JBehaveParser]: Iniciando o parser JBehave
17:25:33,822 INFO (main) [JBehaveParser]: Executando estorias: [a1.storyConverted, a2.storyConverted]
Processing system properties {}
Using controls EmbedderControls[batch=false,skip=false,generateViewAfterStories=true,ignoreFailureInStories=true,ignoreFailureInView=true,verboseFailures=true,verboseFiltering=false,storyTimeoutInSecs=3600,threads=1]
(BeforeStories)
17:25:33,901 INFO (main) [BeforeAfterSteps]: >>Iniciando Aplicação<<
log4j:WARN No appenders could be found for logger (org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Running story a1.storyConverted
Funcionalidade: Acesso
(a1.storyConverted)
Narrative:
In order to a tela inicial apareceça para mim
As a visitante
I want to acessar o Google
Scenario: Acesso ao Google - a1
Dado que vou para a tela "Tela de Busca"
Então será exibido "Google"
Scenario: Pesquisa Simples - a1
Dado que vou para a tela "Tela de Busca"
Quando informo "Demoiselle Behave" no campo "Campo de Busca"
Então será exibido "https://github.com/demoiselle/behave/"
Running story a2.storyConverted
Funcionalidade: Acesso
(a2.storyConverted)
Narrative:
In order to a tela inicial apareceça para mim
As a visitante
I want to acessar o Google
Scenario:
Scenario: Pesquisa Simples2 - a2
Dado que vou para a tela "Tela de Busca"
Quando informo "Demoiselle Behave" no campo "Campo de Busca"
Então será exibido "https://github.com/demoiselle/behave/"
(AfterStories)
17:25:58,705 INFO (main) [BeforeAfterSteps]: >>Finalizando Aplicação<<
Generating reports view to '/home/01069360503/workspace-dbehave/teste/target/jbehave' using formats '[defaultstoryreport, console, html, stats]' and view properties '{defaultFormats=stats, decorateNonHtml=true, viewDirectory=view, decorated=ftl/jbehave-report-decorated.ftl, reports=ftl/jbehave-reports-with-totals.ftl, maps=ftl/jbehave-maps.ftl, navigator=ftl/jbehave-navigator.ftl, views=ftl/jbehave-views.ftl, nonDecorated=ftl/jbehave-report-non-decorated.ftl}'
Reports view generated with 2 stories (of which 1 pending) containing 4 scenarios (of which 1 pending)
17:25:58,930 INFO (main) [JBehaveParser]: Finalizando parser JBehave
17:25:58,931 INFO (main) [BehaveContext]: --------------------------------
17:25:58,931 INFO (main) [BehaveContext]: Demoiselle Behave Finalizado
17:25:58,931 INFO (main) [BehaveContext]: --------------------------------
from behave.
Testes (jBehave)===>
4.0-beta-3
@Override
protected List<String> storyPaths() {
return Arrays.asList("a1.story", "a2.story", "a1.story", "a2.story");
}
Processing system properties {}
Using controls EmbedderControls[batch=false,skip=false,generateViewAfterStories=true,ignoreFailureInStories=true,ignoreFailureInView=true,verboseFailures=false,verboseFiltering=false,storyTimeoutInSecs=60,threads=1]
(BeforeStories)
Running story a1.story
(a1.story)
Scenario: A1
@given ->A1.1
Given Step A1.1
@when ->A1.2
When Step A1.2
@when ->A1.3
And Step A1.3
@then ->A1.4
Then Step A1.4
Running story a2.story
(a2.story)
Scenario: A2
@given ->A2.1
Given Step A2.1
@when ->A2.2
When Step A2.2
@when ->A2.3
And Step A2.3
@then ->A2.4
Then Step A2.4
Running story a1.story
(a1.story)
Scenario: A1
@given ->A1.1
Given Step A1.1
@when ->A1.2
When Step A1.2
@when ->A1.3
And Step A1.3
@then ->A1.4
Then Step A1.4
Running story a2.story
(a2.story)
Scenario: A2
@given ->A2.1
Given Step A2.1
@when ->A2.2
When Step A2.2
@when ->A2.3
And Step A2.3
@then ->A2.4
Then Step A2.4
(AfterStories)
Generating reports view to '/home/01069360503/workspace-dbehave/testes/target/jbehave' using formats '[stats, console, txt, html, xml]' and view properties '{defaultFormats=stats, decorateNonHtml=true, viewDirectory=view, decorated=ftl/jbehave-report-decorated.ftl, reports=ftl/jbehave-reports-with-totals.ftl, maps=ftl/jbehave-maps.ftl, navigator=ftl/jbehave-navigator.ftl, views=ftl/jbehave-views.ftl, nonDecorated=ftl/jbehave-report-non-decorated.ftl}'
Reports view generated with 2 stories (of which 0 pending) containing 2 scenarios (of which 0 pending)
from behave.
No Demoiselle Behave (1.2.1-SNAPSHOT)
As histórias não são executadas duas vezes, isto é, são convertidas corretamente em duas historias, mas não são executadas duas vezes, não permitindo o reuso de historias:
"Executando estorias: [a1.storyConverted, a2.storyConverted]"
...
Log acima
from behave.
No jbehave (4.0-beta-3)
As histórias são executadas duas vezes, isto é, permitem o reuso de historias:
...
Log acima
from behave.
O Julian acabou de fazer um commit que corrige o problema. atualiza e testa.
from behave.
Funcionou assim:
@test
public void testAllStories() throws Throwable {
ArrayList stories = new ArrayList();
stories.add("/a1.story");
stories.add("/a2.story");
eng.run(stories);
stories = new ArrayList<String>();
stories.add("/a1.story");
stories.add("/a2.story");
eng.run(stories);
Assim não funciona:
@test
public void testAllStories() throws Throwable {
ArrayList stories = new ArrayList();
stories.add("/a1.story");
stories.add("/a2.story");
stories.add("/a1.story");
stories.add("/a2.story");
eng.run(stories);
}
}
from behave.
O que fica para ver no futuro "distante" (eu acho) é o relatório de execução. Nem o jbehave apresenta o relatório corretamente. Não seria duas execuções?????
from behave.
Related Issues (20)
- Quais os passos para atualizar versão do Behave? HOT 10
- Possível bug na classe BehaveContext HOT 4
- Nova configuração para ativar e desativar logs estatísticos de execução
- Ubuntu16 + Eclipse 64 bits x Chromedriver 2.20 HOT 1
- Behave - Cenarios da suite não sendo executados se um cenarios anterior falha na versao 1.5.3 HOT 8
- Integração Testlink HOT 3
- Padronizar o nome do componente "Tree" do PrimeFaces HOT 2
- É possível automatizar o preenchimento do componente ng2-select do Angular usando o CommonSteps? HOT 4
- A configuração de verificação de cenários duplicados não esta funcionando corretamente HOT 1
- Problema com a integração do SoapUI HOT 1
- Suporte ao Selenium 3.x HOT 7
- Mapeamento de elemento Select HOT 20
- Exportação de casos de teste JUnit/Selenium a partir das histórias HOT 7
- Erro de Parser ao integrar-se com o ALM HOT 1
- Upgrade da versão do Java para a 8
- Versão 1.6.0 BETA 2 Lançada HOT 9
- Problema no preenchimento de uma caixa de texto em uma aplicação Angular HOT 1
- Implementar runner NgWebDriver para aplicações Angular
- @juliancesar deu certo cara! Muito Obrigado.
- Seguindo o manual https://antigogestao.frameworkdemoiselle.gov.br/documentacaodoprojeto/manuais-e-tutoriais/manuais/guia-demoiselle-nimble-com-eclipse-github-groovy, eu clonei, importei e converti o demoiselle-nimble-eclipse para groovy,
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from behave.