Czy muszę używać tych samych zmiennych we wszystkich modułowej teście?

0

Pytanie

Tworzę testy jednostkowe w Javie, i dla każdej metody tworzę te same listy, zmienne itp. Z drugiej strony, oczywiście, myślałem, że mogę stworzyć wszystkie te zmienne jako globalne i ustawić ich wartości w setup() sposób (w @Before), ale nie jestem pewien, że wartości mogą być zmieniane podczas wykonywania testów z wielowątkowości itp. Więc jaki jest najlepsze wyjście z tej sytuacji?

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

Najlepsza odpowiedź

2

Nie ma się o co martwić. JUnit stworzy nowy egzemplarz swojego testowego klasy, a następnie uruchomi każdy @Before metoda, i dopiero wtedy uruchom @Test metoda i powtarza tę piosenkę i taniec w kółko dla każdego @Test odnotowany metody w tej klasie. Używasz @Before dokładnie tak, jak było zaplanowane: jest on przeznaczony do przechowywania kodu inicjalizacji, niezbędnego do wszystkich testów, w tym testowym klasie.

JUnit robi to w ten sposób, bo miło mieć "niezależność od testów": testy, najlepiej, oblewają lub odbywają się niezależnie od kolejności, w jakiej je wykonujesz.

Od czasu do czasu proces inicjalizacji tak drogie, że nie warto płacić za "cena" jego ponownego uruchomienia dla każdego testu. Streszczenie @BeforeClass istnieje specjalnie do tego celu. Явадок z @BeforeClass nawet stwierdza, że to stawia pod znakiem zapytania niezależność testowania i dlatego powinny być stosowane tylko wtedy, gdy praca konfiguracji, wykonywane w ramach tej metody, jest dość kosztowne (z punktu widzenia obliczeń lub w inny sposób) w celu osiągnięcia kompromisu.

Innymi słowy:

Twoje obawy co do niepodległości testów są prawdziwe, ale mają one zastosowanie do @BeforeClass. @Before nie cierpią z powodu tego problemu; ten kod ponownie uruchamiany dla każdego testu.

UWAGA: możesz wyrzucić wszystko przez okno, jeśli masz static coś się dzieje. W testowanym kodzie nie ma statycznych elementów, jeśli naprawdę nie wiesz, co robisz. Zakładam, że u ciebie tego nie ma, i w tym przypadku - dalej, twoje testy są niezależne od siebie.

2021-11-23 13:38:26

Wielkie dzięki, masz jakiś przykład kodu, który pokazuje właściwe wykorzystanie?
rzwitserloot

Nie rozumiał różnicy między @BeforeClass i @Before. Jakieś wyjaśnienia, proszę?
Amadán

wszystkie metody z @Before uruchamiane przed każdym testem. Wszystkie metody z @BeforeClass działają tylko raz, przed każdym testem. Zwykle instalujesz static rzeczy z @BeforeClass który następnie jest ponownie wykorzystywane (w taki sposób, testy nie są niezależne). Instalujesz niestatyczne elementy rzeczy za pomocą @Beforei dlatego testy są niezależne od siebie. Wystarczy przeczytać dokumenty do tych notatek.
rzwitserloot

@BeforeClass (5 czerwca: @BeforeAll) odbywa się jeden raz dla całego testu klasy, @Before (5 czerwca: @BeforeEach) jest wykonywana przed każdym poszczególnym metodą testowania.
rzwitserloot

Używam JUnit5, więc widzę różnicę między @BeforeEach przeciwko @BeforeAll no z twoich wyjaśnień. Jednak nie jestem pewien, czy należy czyścić listy, używane wieloma zadaniami, czy nie. Muszę je wyczyścić w @AfterEach. Jakieś pomysły?
avandeursen

Nie czyść listę. To również brzmi tak, jakby trzeba trochę pobawić się z tym, bo, oczywiście, odpowiedzi SO dla ciebie za mało. Jest to dobry instynkt! Po prostu ... zrób kilka testów, dodać kilka elementów do listy, który jest inicjalizowany tylko raz w @Beforei wydrukuj coś-nic nie usuwając. Następnie po prostu obserwuj, co się dzieje.

Tak, to można by zagrać, ale myślę, że to naprawdę jest normalna sytuacja, i do tego musi być ogólne podejście. Tak więc, muszę tylko wyjaśnić umowa o modułowej testów w celu ponownego wykorzystania tych samych zmiennych (na przykład, po prostu definiując raz w @beforeach LUB @beforeAll, oczyścić zmienne na @AfterEach. Więc jaki jest właściwe podejście do tej sytuacji?. Jakieś pomysły?

Skorzystaj z @Before. Nie mam pojęcia, co jeszcze może cię strącić z tronu w tej chwili. W odpowiedzi wszystko jasne powiedziane!

W innych językach

Ta strona jest w innych językach

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