Eu sou a criação de Testes de Unidade em Java e para cada método, eu crio as mesmas listas, variáveis, etc. Por outro lado, é claro que eu pensei que eu poderia criar todas estas variáveis globais e definir seus valores no setup()
método (em @Before
), mas eu não tenho certeza se os valores podem ser alterados quando a execução de testes devido a multithreading, etc. Então, qual é a melhor forma para esta situação?
Nada para se preocupar. JUnit vai criar uma nova instância da classe de teste e, em seguida, executar cada @Before
o método, e só então executar o @Test
o método, e faz que a música e a dança rotina tudo de novo para todos @Test
anotada método na classe. Você está usando @Before
exatamente como ele foi concebido: para armazenar o código de inicialização que é necessário para todos os testes em que classe de teste.
JUnit não é desta forma porque "teste de independência' é bom ter: Testes, de preferência, falhar ou passar independente da ordem em que você executá-los.
Muitas vezes, o processo init é tão caro que não vale a pena pagar o 'custo' de executá-lo uma e outra vez para cada teste. A anotação @BeforeClass
existe especificamente para essa finalidade. O javadoc da @BeforeClass
mesmo enuncia que isto compromete a testar a independência e, portanto, deve ser usado somente se o trabalho de configuração que você fizer no prazo de um tal método é bastante caro (computacionalmente, ou de outra forma) para fazer essa troca.
Em outras palavras:
Suas preocupações sobre o teste de independência são reais, mas eles se aplicam ao @BeforeClass
. @Before
não sofre deste problema; que o código for executado novamente para cada teste.
NB: Você pode colocar tudo isso para fora da janela, se tiver static
coisas acontecendo. Não tem estático coisas no código de teste, a menos que você realmente saiba o que está fazendo. Eu suponho que você não tem que nesse caso - exercer, em seus testes são independentes.
@BeforeClass
e @Before
. Qualquer esclarecimento pls? @Before
são executados antes de cada teste. Todos os métodos com @BeforeClass
são executados apenas uma vez, antes de qualquer teste. Geralmente, você definir static
coisas com @BeforeClass
qual é, então, re-utilizado (por isso, os testes não são independentes). Você definir não-estático coisas com @Before
e assim os testes são independentes. Basta ler os documentos para estas anotações. @BeforeClass
(JUnit 5: @BeforeAll
) é executado uma vez para toda a classe de teste, @Before
(JUnit 5: @BeforeEach
) é executado antes de cada método de teste. @BeforeEach
vs @BeforeAll
bem, a partir de suas explicações. No entanto, eu não tenho certeza se eu deveria ou não limpar as listas que são utilizados por várias teste. Eu ay precisa para desmarcá-las em @AfterEach
. Alguma idéia? @Before
e imprimir algumas coisas - sem retirar nada. Em seguida, basta observar o que acontece. @AfterEach
. Então, o que é a abordagem correta para esta situação?. Alguma idéia? @Before
. Eu não tenho nenhuma idéia do que poderia ainda estar confuso você neste ponto. A resposta soletra-lo!