Měl bych použít stejné proměnné přes celá Jednotka Test?

0

Otázka

Já jsem vytváření Unit Testů v Javě a pro každou metodu, vytvořit stejné seznamy, proměnné, atd. Na druhou stranu, samozřejmě, že jsem myslel, že jsem mohl vytvořit všechny tyto proměnné jako globální, a nastavte jejich hodnoty v setup() metoda (v @Before), ale nejsem si jistý, jestli hodnoty, které mohou být změněny, když testy kvůli multithreading, atd. Takže, co je nejlepší způsob, jak pro tuto situaci?

java junit junit5 testing
2021-11-23 13:33:22
1

Nejlepší odpověď

2

Nic se bát. JUnit vytvoří novou instanci vaše testovací třídy, a pak spustit každý @Before metoda, a teprve pak spustit @Test metoda, a to, že píseň a taneček znovu pro každý @Test komentovaný metoda v této třídě. Používáte @Before přesně tak, jak bylo zamýšleno: To je pro uložení inicializační kód, který je vyžadován pro všechny testy v testovací třídě.

JUnit to tímto způsobem, protože test nezávislosti' je hezké mít: Testy, nejlépe, fail nebo pass nezávisle na objednávce, ve které budete spouštět je.

Každý tak často, proces init je tak drahé, že to nestojí za to, aby zaplatit "náklady" běží to znovu a znovu pro každý test. Anotace @BeforeClass existuje speciálně pro ten účel. Na javadoc z @BeforeClass dokonce vysvětluje, že to ohrožuje test nezávislosti, a proto by měly být používány, pouze pokud instalační práce v rámci této metody je dostatečně drahé (počítačově nebo jinak), aby to kompromis.

Jinými slovy:

Vaše starosti o test nezávislosti jsou skutečné, ale oni se vztahují na @BeforeClass. @Before netrpí tento problém, že kód je re-run pro každý test.

POZNÁMKA: můžete vyhodit vše z okna, pokud máte static věci děje. Nemám statické věci v testovací kód, pokud opravdu víte, co děláte. Předpokládám, že nemáte, že v tom případě pokračuj, tvoje testy jsou nezávislé.

2021-11-23 13:38:26

Díky moc, jakékoliv příklad kódu, které ukazují správné využití?
rzwitserloot

Nechápal jsem rozdíl mezi @BeforeClass a @Before. Žádné vysvětlení pls?
Amadán

všechny metody s @Before jsou spouštěny před každý test. Všechny metody s @BeforeClass jsou spuštěny pouze jednou, a to před každou zkouškou. Obecně platí, že můžete nastavit static věci s @BeforeClass což je pak znovu použit (tak, testy jsou již nezávislé). Můžete nastavit non-statické věci s @Beforea tak testy jsou nezávislé. Stačí si přečíst dokumenty pro tyto popisy.
rzwitserloot

@BeforeClass (JUnit 5: @BeforeAll) se spustí jednou pro celé testovací třídy, @Before (JUnit 5: @BeforeEach) se spouští před každým jeden zkušební metody.
rzwitserloot

Používám JUnit5, pak vidím rozdíl mezi @BeforeEach vs @BeforeAll no, z vašeho vysvětlení. Nicméně, nejsem si jistý, jestli bych měl, nebo není jasné, seznamy, které jsou používány více test. Já ay potřebují, aby jim jasné, ve @AfterEach. Nějaký nápad?
avandeursen

Není jasné seznamu. To také zní jako bys měl hračky s kolem trochu, protože se zřejmě o TAK odpověď není dostačující pro vás. To je dobrý instinkt! Jen.. udělat nějaké testy, přidat nějaké prvky do seznamu inicializována pouze jednou v @Beforea tisknout nějaké věci - bez odstranění čehokoliv. Pak stačí pozorovat, co se stane.

Ano, to by mohl být hrál, ale myslím si, že je to opravdu běžné, situace a musí být obecný přístup. Takže, jen je třeba upřesnit o Test Jednotky úmluvy pro opětovné použití stejné proměnné (např. právě definování jednou v @BeforeEach NEBO @BeforeAll, jasné proměnné na @AfterEach. Takže, co je správný přístup k této situaci?. Nějaký nápad?

Použití @Before. Nemám ponětí, co by mohlo ještě být matoucí v tomto bodě. Odpověď kouzla!

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................