W JUnit 3 mogłem uzyskać nazwę aktualnie uruchomionego testu w następujący sposób:
public class MyTest extends TestCase
{
public void testSomething()
{
System.out.println("Current test is " + getName());
...
}
}
które wyświetliłoby komunikat „Bieżący test to test”.
Czy w JUnit 4 jest jakaś gotowa lub prosta metoda?
Tło: Oczywiście nie chcę po prostu drukować nazwy testu. Chcę załadować dane specyficzne dla testu, które są przechowywane w zasobie o tej samej nazwie co test. Wiesz, konwencja o konfiguracji i tak dalej.
java
unit-testing
junit
Dave Ray
źródło
źródło
Odpowiedzi:
JUnit 4.7 dodał tę funkcję, korzystając z reguły TestName . Wygląda na to, że otrzymasz nazwę metody:
źródło
@Rule
przed@Before
- Jestem nowym JUnit i został zależnościTestName
w moim@Before
bez żadnych trudności.JUnit 4.9.xi wyższe
Od JUnit 4.9
TestWatchman
klasa jest przestarzała na rzeczTestWatcher
klasy, która ma wywołanie:Uwaga: Klasa zawierająca musi zostać zadeklarowana
public
.JUnit 4.7.x - 4.8.x
Następujące podejście wypisze nazwy metod dla wszystkich testów w klasie:
źródło
public
pola?JUnit 5 i nowszy
W JUnit 5 możesz wstrzykiwać,
TestInfo
co upraszcza metadane testowe zapewniające metody testowe. Na przykład:Zobacz więcej: Podręcznik użytkownika JUnit 5 , TestInfo javadoc .
źródło
Spróbuj zamiast tego:
Dane wyjściowe wyglądają następująco:
UWAGA: To NIE DZIAŁA, jeśli twój test jest podklasą TestCase ! Test działa, ale kod @Rule po prostu nigdy nie działa.
źródło
Zastanów się nad użyciem SLF4J (Simple Logging Facade for Java) zapewnia pewne udoskonalenia za pomocą sparametryzowanych komunikatów. Połączenie SLF4J z implementacjami reguł JUnit 4 może zapewnić bardziej wydajne techniki rejestrowania klas testów.
źródło
Skręconym sposobem jest utworzenie własnego Runnera przez podklasowanie org.junit.runners.BlockJUnit4ClassRunner.
Następnie możesz zrobić coś takiego:
Następnie dla każdej klasy testowej musisz dodać adnotację @RunWith (NameAwareRunner.class). Ewentualnie możesz umieścić tę adnotację w nadklasie testowej, jeśli nie chcesz jej pamiętać za każdym razem. To oczywiście ogranicza wybór biegaczy, ale może to być do zaakceptowania.
Może również zająć trochę kung fu, aby pobrać bieżącą nazwę testową z Runnera do twojego frameworka, ale to przynajmniej zapewni ci nazwę.
źródło
JUnit 4 nie ma gotowego mechanizmu do testowania, aby uzyskać własną nazwę (w tym podczas instalacji i porzucenia).
źródło
źródło
W oparciu o poprzedni komentarz i dalsze rozważania stworzyłem rozszerzenie TestWather, którego można użyć w metodach testowych JUnit za pomocą tego:
Klasa pomocnika testowego jest następna:
Cieszyć się!
źródło
ImportUtilsTest
się błąd, wygląda na to, że jest to klasa rejestratora, czy mam więcej informacji? Dziękiźródło
Proponuję oddzielić nazwę metody testowej od zestawu danych testowych. Modelowałbym klasę DataLoaderFactory, która ładuje / buforuje zestawy danych testowych z twoich zasobów, a następnie w twoim przypadku testowym kamera wywołuje metodę interfejsu, która zwraca zestaw danych testowych dla przypadku testowego. Powiązanie danych testowych z nazwą metody testowej zakłada, że danych testowych można użyć tylko raz, w większości przypadków sugerowałbym, aby te same dane testowe były używane w wielu testach w celu weryfikacji różnych aspektów logiki biznesowej.
źródło
Możesz to osiągnąć za pomocą
Slf4j
iTestWatcher
źródło
W JUnit 5
TestInfo
działa jako drop-in zamiennik reguły TestName z JUnit 4.Z dokumentacji:
Aby pobrać nazwę metody aktualnie wykonywanego testu, masz dwie opcje:
String TestInfo.getDisplayName()
iMethod TestInfo.getTestMethod()
.Aby pobrać tylko nazwę bieżącej metody testowej,
TestInfo.getDisplayName()
może nie wystarczyć, ponieważ domyślna nazwa wyświetlana metody testowej tomethodName(TypeArg1, TypeArg2, ... TypeArg3)
.Powielanie nazw metod w
@DisplayName("..")
nie jest koniecznym dobrym pomysłem.Alternatywnie możesz użyć
TestInfo.getTestMethod()
zwracającegoOptional<Method>
obiekt.Jeśli metoda pobierania jest używana w metodzie testowej, nie trzeba nawet testować
Optional
opakowanej wartości.źródło
JUnit 5 przez ExtensionContext
Korzyść:
Możesz mieć dodatkowe funkcje
ExtensionContext
zastępowaniaafterEach(ExtensionContext context)
.źródło