demoiselle / behave

Demoiselle Behave
https://www.frameworkdemoiselle.gov.br/dbehave/
29 stars 53 forks source link

Problemas ao atualizar da versão 1.5.1 para versão 1.5.2 final #443

Closed otmarjr closed 7 years ago

otmarjr commented 7 years ago

Olá!

Hoje temos uma larga base de código que utiliza os testes automatizados no padrão de adicionar histórias para reuso por método de teste em cada classe de teste separada.

Após tentar atualizar para a versão 1.5.2, apesar do behave.properties não possuir a propriedade legacyRunner definida como false, noto que a execução está com o novo padrão. Adiciono as histórias de reuso por método de teste, e as mesmas não estão sendo removidas ao final de cada método de teste, conforme descrito em http://demoiselle.sourceforge.net/docs/components/behave/reference/lastversion/html/behave-scope.html

Para cada método ocorre o erro: O arquivo de história [/home/07257618658/workspace-siefpar/SiefPar/01-Sistema/06-Teste/testeautomatizado/target/test-classes/stories/intranet/cadastrarModalidade/cenariosComuns.story] foi adicionado 2 vezes, favor verificar.

juliancesar commented 7 years ago

@ttperes, você pode nos dar uma ajuda nesta questão?

ttperes commented 7 years ago

Bom dia!

Se legacyRunner = true Histórias - context.addStories(); Histórias de reuso - context.addStoriesReuse(); Passos personalizados - context.addSteps(). Se você está usando assim, não está usando o método novo.

Se legacyRunner = false Global - context.addStepsGlobal(), context.addStoriesGlobal(), context.addStoriesReuseGlobal(); Classes - context.addStepsClass(), context.addStoriesClass(), context.addStoriesReuseClass(); Método - context.addStepsMethod(), context.addStoriesMethod(), context.addStoriesReuseMethod().

Os métodos são diferentes propositalmente.

No caso de usar os métodos de um no padrão do outro, o behave jogará uma exceção nem iniciando os testes.

Existe um bug na versão do padrão antigo que foi um dos motivadores para justamente criar o novo modelo.

Este erro, foi contornado por mim e pelo Julian de forma a não impactar os demais testes legados. Para contornar esse problema, você deve dar um clearAllstories() (no runner) antes de cada run().

gabrielsilgon commented 7 years ago

Olá pessoal,

o legacyRunner não tem seu valor explicitado no "behave.properties". Ao definí-lo manualmente para 'true', vide comentário do @ttperes,

"Se legacyRunner = true Histórias - context.addStories(); Histórias de reuso - context.addStoriesReuse(); Passos personalizados - context.addSteps(). Se você está usando assim, não está usando o método novo."

continuo sem conseguir executar meus testes. Comecei a ter este problema assim que atulizei para a versão 1.5.2. Na verdade, ele executa o primeiro .story corretamente e lança uma exceção para cada um dos demais. Segue abaixo a saída no console:

_13:49:10,688 ERROR (main) [BehaveContext]: Erro não esperado ao executar o Demoiselle Behave br.gov.frameworkdemoiselle.behave.exception.BehaveException: O arquivo de história [/home//workspace-behave/Fibra-Calculo-AutoTeste/target/test-classes/stories/reuso/reusoEntradasCalcFormularioParcelamento.story] foi adicionado 2 vezes, favor verificar. at br.gov.frameworkdemoiselle.behave.internal.parser.StoryFileConverter.convertReusedScenarios(StoryFileConverter.java:68) at br.gov.frameworkdemoiselle.behave.controller.BehaveContext.run(BehaveContext.java:237) at br.gov.frameworkdemoiselle.behave.controller.BehaveContext.run(BehaveContext.java:288) at br.gov.serpro.demoisellebehave.Fibra_CalculoAutoTeste.main.local.ConsolidacaoTestLocal.testarParametrosDeEntradaValidarUF(ConsolidacaoTestLocal.java:36) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 13:49:10,689 INFO (main) [BehaveContext]: -------------------------------- 13:49:10,690 INFO (main) [BehaveContext]: Demoiselle Behave Finalizado 13:49:10,690 INFO (main) [BehaveContext]: --------------------------------

Vocês teriam alguma sugestão para contornar essa mudança de comportamento da versão 1.5.2?

Obrigado, Gabriel Silva

juliancesar commented 7 years ago

Por enquanto a recomendação é voltar para versão que funcionava corretamente pois iremos analisar esta situação assim que for possível.

Obrigado pela colaboração.

juliancesar commented 7 years ago

retomando o assunto vou ainda esta semana para corrigir o problema em uma 1.5.3-SNAPSHOT e gerar a versão 1.5.3 FINAL o mais breve possível.

juliancesar commented 7 years ago

O problema foi detectado no seguinte trecho de código que foi adicionado durante o desenvolvimento da versão 1.5.2, sendo que ele faz uma verificação de existência de cenários duplicados.

https://github.com/demoiselle/behave/blob/master/impl/core/src/main/java/br/gov/frameworkdemoiselle/behave/internal/parser/StoryConverter.java#L166

Ainda hoje será gerada uma versão 1.5.3-SNAPSHOT contendo a correção e para que funcione efetivamente será necessário informar a propriedade behave.parser.erroDuplicateScenarios como false no arquivo behave.properties.

@otmarjr, um detalhe importante que percebi em um dos comentário e acredito que seja pertinente citar.

o legacyRunner não tem seu valor explicitado no "behave.properties".

Os valores padrões das propriedades são explicitados via código Java no arquivo https://github.com/demoiselle/behave/blob/master/impl/core/src/main/java/br/gov/frameworkdemoiselle/behave/config/BehaveConfig.java e tentamos ao máximo deixar a documentação atualizada para corresponder com o código.

http://demoiselle.sourceforge.net/docs/components/behave/reference/lastversion/html/behave-configuracao.html

No exempo do legacyRunner a documentação esta:

behave.runner.legacyRunner : Habilita ou desabilita o modo de execução legado para retrocompatibilidade. O valor padrão é true.

e o Java esta:

// Ativa o uso da nova implementação que separa os .story por escopos ou mantém a maneira original sem escopos
public static boolean getRunner_legacyRunner() {
    return Boolean.parseBoolean(getProperty("behave.runner.legacyRunner", "true"));
}
juliancesar commented 7 years ago

Senhores, for gerada uma versão 1.5.3-SNAPSHOT contendo a correção, favor testar.

Alterem o pom.xml para a versão citada e verifiquem se ao executar os testes a saída do console é igual ao texto a seguir:

INFO  (main) [BehaveContext]: --------------------------------
INFO  (main) [BehaveContext]: Demoiselle Behave Iniciado
INFO  (main) [BehaveContext]: Demoiselle Behave 1.5.3-SNAPSHOT em: 02/01/2017 16:14
INFO  (main) [BehaveContext]: --------------------------------

Para que funcione efetivamente será necessário informar a propriedade behave.parser.erroDuplicateScenarios como false no arquivo behave.properties.

juliancesar commented 7 years ago

@gabrielsilgon e @otmarjr, algum retorno sobre a nova SNAPSHOT gerada com a correção do problema relatado?

Aguardo.

otmarjr commented 7 years ago

Acabei corrigindo com uma superclasse que limpa o context antes da execução de cada método de teste. Sigo na versão 1.5.2

juliancesar commented 7 years ago

@otmarjr, peço que faça o teste com a 1.5.3-SNAPSHOT e nos retorne o resultado para que possamos fechar esta issue, gerar a versão final com a correção e avisar o restante dos usuários.

Obrigado pela sua atenção e colaboração.

otmarjr commented 7 years ago

Executei um teste aqui e funcionou corretamente.

juliancesar commented 7 years ago

Pretendo gerar a versão 1.5.3 FINAL ainda neste mês de abril contendo a correção, por isso vou deixar esta issue aberta.