DZWON

Są tacy, którzy czytają tę wiadomość przed tobą.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać The Bell
Bez spamu

W poszukiwaniu problemów testowych dla programistów java natknąłem się na interesującą stronę (użytkownicy Avast nie wychodzą, wykrywany jest trojan skryptowy, reszta prawdopodobnie może) - http://www.betterprogrammer.com. Sprawdza kwalifikacje programistów Java w najprostszy, ale automatyczny sposób: oferując napisanie kilku funkcji (metod) o rosnącej złożoności i skopiowanie kodu do TextArea. Ponadto silnik strony robi coś z zadaniami (nie inaczej niż test jednostkowy), oblicza pewien wskaźnik kwalifikacji zgodnie z kryteriami „jakości prędkości” i wystawia ocenę końcową w następującej formie:

Wtedy zaczynają się pytania. Ja sam programowałem w Javie drugi raz w życiu (i dlatego właśnie przegotowałem trudne zadania), więc 82% na tym teście odpowiada poziomowi programista inny niż java... Ile w takim razie należy zatrudnić Java Junior, Java Programmer, a tym bardziej Java Senior ?! Czego można się spodziewać teraźniejszość programista java - 90, 95, 99? I wreszcie, co się stanie, jeśli „programista” dostanie mniej niż 82, a mimo to zgłosi się do jakiejś pracy ?!

Java to zorientowany obiektowo, silnie typizowany język programowania opracowany przez Sun Microsystems w 1991 roku. Język pierwotnie nosił nazwę Oak i był przeznaczony do programowania elektroniki użytkowej, ale później zmieniono jego nazwę na Java. Oficjalne wydanie Javy w 1995 roku okazało się bardzo udane, a wkrótce potem Java zajęła silną pozycję jako narzędzie do tworzenia aplikacji serwerowych.

Obecnie Java jest używana we wszystkich obszarach tworzenia oprogramowania - aplikacjach serwerowych, aplikacjach desktopowych, narzędziach, aplikacjach internetowych - wszystkie tworzone przy użyciu języka Java i powiązanych technologii.

Docelowi odbiorcy testu Java

Test Java zawiera pytania, na które większość programistów z minimalnym doświadczeniem w programowaniu w języku Java zna odpowiedzi. Test przyda się wielu osobom, w tym osobom, które nie mają dużego doświadczenia z Javą i chcą uzyskać minimalne zrozumienie podstawowych pojęć tego popularnego języka programowania. Test ten może być również przydatny dla studentów uczących się języka Java, do utrwalenia wiedzy zdobytej na uczelniach lub w wyniku samodzielnej pracy.

Wymagania wstępne dotyczące testów Java

Zakłada się, że przed przystąpieniem do testu Podstawy języka Java znasz już podstawowe pojęcia, takie jak „zmienna”, „pętla”, „metoda” oraz znasz składnię podstawowych konstrukcji językowych. Jeśli tak nie jest, zalecamy najpierw zapoznać się z podstawami języka Java, czytając kurs wprowadzający.

Struktura testu Java

Test Java - Fundamentals obejmuje następujące tematy:

Możesz przeczytać więcej na temat tematów pytań testowych poniżej:

  • Obiekty i klasy: pytania na ten temat obejmują pojęcia, takie jak klasa, instancja klasy (obiekt), konstruktory, metody i pola klas.
  • Składnia: pytania w tej sekcji sprawdzą twoją znajomość słów kluczowych języka, operatorów, typów podstawowych (prymitywy, ciąg), konstrukcji sterujących (if-else, while, for) oraz zrozumienia obsługi wyjątków (Exception).
  • Inne: Ta sekcja zawiera pytania dotyczące podstawowych pojęć, terminów i skrótów, konwencji nazewnictwa klas, zmiennych i metod. Ta sekcja obejmuje również pliki (.java, .class, .jar) i pakiety, cykl życia obiektu, czyszczenie pamięci.

Wykonanie testu online w języku Java pomaga przetestować i skonsolidować wiedzę na temat podstaw języka Java, a także prowadzi do bardziej zaawansowanych testów z sekcji testów języka Java.

Mamy nadzieję, że ten test okaże się przydatny i zabawny.

Dalszy rozwój testu Java

Test Java jest stale aktualizowany o nowe pytania.

W najbliższej przyszłości zespół Quizful planuje stworzenie testów Java na poziomie eksperckim. Być może test Java Puzzlers nadal będzie powstawał, ale niestety bardzo powoli wypełnia się pytaniami.

Jeśli masz jakieś uwagi dotyczące pytań testowych, napisz do nas. Powodzenia.

Testowanie nie zawsze jest zabawne i interesujące. Ten proces jest zwykle dość długi i czasami pełen monotonnej pracy. Wydaje się, że nie tak dawno programiści używali standardowego wyjścia lub debuggera do testowania klas java.

W tym artykule opiszę bibliotekę JUnit 4, która znacznie upraszcza i automatyzuje proces pisania testów.

Aby zademonstrować podstawowe funkcje JUnit Framework, napiszemy prymitywną klasę w języku Java i będziemy ją mockować. Ta klasa będzie miała dwie metody - znajdowanie silni liczby nieujemnej i sumy dwóch liczb. Ponadto instancja klasy będzie zawierała licznik wywołań metody.

Klasa publiczna MathFunc (wywołania int; public int getCalls () (wywołania zwrotne;) public long factorial (int number) (wywołania ++; if (number 1) (for (int i \u003d 1; i

Teraz napiszmy testy jednostkowe. W tym celu utworzymy klasę z kilkoma metodami testowymi. Oczywiście klasa może również zawierać zwykłe metody pomocnicze. Aby biegacz testów mógł określić, kto jest kim, metody testowe muszą być opatrzone adnotacją @Test.

Adnotacja może mieć następujące parametry:

  • oczekiwano - wskaż, jaki rodzaj wyjątku zostanie zgłoszony przez metodę (patrz przykład poniżej);
  • timeout - po jakim czasie w milisekundach ma zatrzymać wykonanie testu i zaliczyć go jako nieudany.

Jeśli chcesz wskazać, że dany test powinien zostać pominięty, zaznacz go adnotacją @Ignore. Chociaż można po prostu usunąć adnotację @Test.

Zdarza się, że do wykonania każdego scenariusza testowego potrzebny jest kontekst, na przykład wstępnie utworzone instancje klas. A po wykonaniu musisz zwolnić zarezerwowane zasoby. W takim przypadku potrzebujesz adnotacji @Before i @After. Metoda oznaczona @Before zostanie wykonana przed każdym przypadkiem testowym, a metoda oznaczona @After zostanie wykonana po każdym przypadku testowym.

Jeśli chcesz zainicjować i zwolnić zasoby tylko raz - odpowiednio przed i po wszystkich testach - użyj kilku adnotacji @BeforeClass i @AfterClass.

A oto sama klasa testowa z kilkoma przypadkami testowymi:

Klasa publiczna MathFuncTest (prywatna MathFunc math; @Before public void init () (math \u003d new MathFunc ();) @After public void tearDown () (math \u003d null;) @Test public void Calls () (assertEquals (0, math .getCalls ()); math.factorial (1); assertEquals (1, math.getCalls ()); math.factorial (1); assertEquals (2, math.getCalls ());) @Test public void factorial () (assertTrue (math.factorial (0) \u003d\u003d 1); assertTrue (math.factorial (1) \u003d\u003d 1); assertTrue (math.factorial (5) \u003d\u003d 120);) @Test (oczekiwano \u003d IllegalArgumentException.class) public void factorialNegative () (math.factorial (-1);) @Ignore @Test public void todo () (assertTrue (math.plus (1, 1) \u003d\u003d 3);))

Metoda call sprawdza poprawność licznika wywołań. Metoda czynnikowa sprawdza, czy silnia jest obliczana poprawnie dla niektórych wartości standardowych. Metoda factorialNegative sprawdza, czy wyjątek IllegalArgumentException zostanie zgłoszony dla ujemnych wartości silni. Metoda todo zostanie zignorowana. Spróbuj usunąć adnotację @Ignore podczas eksperymentowania z kodem.

Metoda assertTrue sprawdza, czy wynik wyrażenia jest poprawny. Inne metody, które mogą się przydać:

  • assertEquals - oczekiwany wynik i otrzymany wynik są takie same;
  • assertNull - wyrażenie zwraca wartość null;
  • assertNotNull - wynik wyrażenia jest różny od null;
  • assertSame - oczekiwane i odebrane obiekty są tym samym obiektem.
  • fail - metoda zgłasza wyjątek AssertionError - dodaj go tam, gdzie wykonanie programu nie powinno dotrzeć.

We współczesnym świecie IDE wiedzą, jak znaleźć i po prostu uruchomić testy w projekcie. Ale co, jeśli chcesz uruchomić je ręcznie za pomocą kodu programu. Aby to zrobić, możesz użyć Runnera.Istnieją wersje tekstowe - junit.textui.TestRunner, wersje graficzne - junit.swingui.TestRunner, junit.awtui.TestRunner.

Ale nieco nowocześniejszą metodą jest użycie klasy JUnitCore. Dodaj następującą metodę główną do klasy MathFuncTest:

Public static void main (String args) rzuca Exception (JUnitCore runner \u003d new JUnitCore (); Result result \u003d runner.run (MathFuncTest.class); System.out.println ("uruchom testy:" + result.getRunCount ()); System.out.println ("nieudane testy:" + result.getFailureCount ()); System.out.println ("ignorowane testy:" + result.getIgnoreCount ()); System.out.println ("sukces:" + wynik .było udane ());)

A wynik wykonania:

Uruchom testy: 3 testy zakończone niepowodzeniem: 0 zignorowanych testów: 1 sukces: prawda

We wcześniejszych wersjach JUnit, aby napisać klasę testową, należało utworzyć spadkobiercę junit.framework.TestCase. Następnie konieczne było zdefiniowanie konstruktora, który jako parametr pobierze String - nazwę metody - i przekaże go do klasy nadrzędnej. Każda metoda testowa musiała zaczynać się od przedrostka testu. Do inicjalizacji i zwolnienia zasobów wykorzystano metody setUp i tearDown. Krótko mówiąc, horror. Cóż, teraz wszystko jest proste, tak.

To wszystko na dzisiaj. Jestem pewien, że JUnit Framework bardzo Ci pomoże. Komentarze i pytania dotyczące artykułu są mile widziane.

JUnit to biblioteka do testowania jednostkowego programów Java. Stworzony przez Kenta Becka i Erica Gamma, JUnit należy do rodziny frameworków xUnit dla różnych języków programowania, pochodzących z SUnit for Smalltalk Kenta Becka. JUnit zrodził ekosystem rozszerzeń - JMock, EasyMock, DbUnit, HttpUnit i nie tylko.

Biblioteka JUnit został przeniesiony na inne języki, w tym PHP (PHPUnit), C # (NUnit), Python (PyUnit), Fortran (fUnit), Delphi (DUnit), Free Pascal (FPCUnit), Perl (Test :: Unit), C ++ (CPPUnit) , Flex (FlexUnit), JavaScript (JSUnit).

JUnit To framework Java do testowania, czyli testowania pojedynczych fragmentów kodu, takich jak metody lub klasy. Doświadczenie zdobyte w JUnit jest ważne przy opracowywaniu koncepcji testowania oprogramowania.

Przykład testowy JUnit

Import org.junit.Test; import junit.framework.Assert; public class MathTest (@Test public void testEquals () (Assert.assertEquals (4, 2 + 2); Assert.assertTrue (4 \u003d\u003d 2 + 2);) @Test public void testNotEquals () (Assert.assertFalse (5 \u003d \u003d 2 + 2);))

Potrzeba użycia JUnit

JUnit pozwala szybko zweryfikować, czy Twój kod działa w dowolnym momencie. Jeśli program nie jest bardzo prosty i zawiera wiele klas i metod, jego przetestowanie może zająć dużo czasu. Oczywiście ten proces jest lepiej zautomatyzowany. Za pomocą JUnit pozwala na sprawdzenie kodu programu bez większego wysiłku i nie zajmuje dużo czasu.

Testy jednostkowe klasy i funkcje są rodzajem dokumentacji tego, czego oczekuje się w wyniku ich wykonania. I to nie tylko dokumentacja, ale dokumentacja, która może automatycznie sprawdzić kod pod kątem zgodności z przedstawionymi funkcjami. Jest to wygodne i często testy są opracowywane zarówno razem, jak i przed wdrożeniem klas. Test Driven Development to niezwykle popularna technologia tworzenia poważnego oprogramowania.

Rodzaje badań i miejsce badań JUnit w klasyfikacji

Testowanie oprogramowania można podzielić na dwa typy:

  • testowanie czarnoskrzynkowe;
  • testy białoskrzynkowe.

Podczas testowania programu jako czarnej skrzynki wewnętrzna struktura aplikacji nie jest brana pod uwagę. Liczy się tylko funkcjonalność, którą ma zapewnić aplikacja. Podczas testowania programu jako białej skrzynki brana jest pod uwagę struktura wewnętrzna, tj. klasa i metody. Ponadto testowanie można podzielić na cztery poziomy:

  • testy jednostkowe - testowanie poszczególnych sekcji kodu;
  • testowanie integracji - testowanie interakcji i współpracy komponentów;
  • testowanie systemu - testowanie całego systemu jako całości;
  • testy akceptacyjne - końcowe testy gotowego systemu na zgodność z wymaganiami.

Testy jednostkowe są z definicji testami białoskrzynkowymi.

Testy jednostkowe są stosowane w dwóch wersjach - JUnit 3 i JUnit 4. Rozważmy obie wersje, ponieważ starsze projekty nadal korzystają z wersji 3, która obsługuje Javę 1.4.

JUnit 3

Aby stworzyć test należy odziedziczyć klasę testową TestCase, nadpisać metody setUp i tearDown, jeśli to konieczne, a co najważniejsze, opracować metody testowe, których nazwy powinny zaczynać się od skrótu „test”. Po uruchomieniu testu najpierw tworzona jest instancja klasy test (dla każdego testu w klasie osobna instancja klasy), następnie wykonywana jest metoda setUp, uruchamiany jest sam test, a na końcu wykonywana jest metoda tearDown. Jeśli którakolwiek z metod zgłosi wyjątek, uznaje się, że test zakończył się niepowodzeniem.

Uwaga: metody testowe muszą być publiczne, mogą być statyczne.

Testy składają się z wykonania kodu i sprawdzenia. Kontrole są najczęściej wykonywane przy użyciu klasy Zapewniać chociaż czasami używane jest słowo kluczowe assert.

Jako przykład rozważmy narzędzie tekstowe, które zawiera metody sprawdzania pustego ciągu i reprezentujące sekwencję bajtów jako ciąg szesnastkowy:

Klasa publiczna JUnit3StringUtilsTest rozszerza TestCase (prywatna ostateczna mapa toHexStringData \u003d new HashMap (); protected void setUp () rzuca Exception (toHexStringData.put ("", nowy bajt); toHexStringData.put ("01020d112dte7f", nowy bajt) 13,17,45,127)); toHexStringData.put ("00fff21180", new byte (0, -1, -14,17, -128)); // ...) protected void tearDown () rzuca Exception (toHexStringData. clear ();) public void testToHexString () (for (Iterator iterator \u003d toHexStringData.keySet (). iterator (); iterator.hasNext ();) (oczekiwany końcowy String \u003d (String) iterator.next (); końcowy bajt testData \u003d (bajt) toHexStringData.get (oczekiwane); końcowy String rzeczywiste \u003d StringUtils.toHexString (testData); assertEquals (oczekiwane, rzeczywiste);)) // ...)

Dodatkowe funkcje, TestSuite

JUnit 3 ma kilka dodatkowych funkcji. Na przykład możesz grupować testy. Aby to zrobić, musisz użyć klasy TestSuite:

Klasa publiczna JUnit3StringUtilsTestSuite extends TestSuite (public JUnit3StringUtilsTestSuite () (addTestSuite (StringUtilsJUnit3Test.class); addTestSuite (OtherTest1.class); addTestSuite (OtherTest) .class).

Możesz powtórzyć wykonanie testu kilka razy. W tym celu używany jest RepeatedTest:

Klasa publiczna JUnit3StringUtilsRepeatedTest extends RepeatedTest (public JUnit3StringUtilsRepeatedTest () (super (new JUnit3StringUtilsTest (), 100);))

Dziedzicząc klasę testową z ExceptionTestCase, możesz sprawdzić kod pod kątem zgłaszania wyjątku:

Klasa publiczna JUnit3StringUtilsExceptionTest extends ExceptionTestCase (public JUnit3StringUtilsExceptionTest (final String name) (super (name, NullPointerException.class);) public void testToHexString () (StringUtils.toHexString (null);))

Jak widać na przykładach, wszystko jest dość proste i nic zbędnego - minimum kodu do testowania JUnit.

JUnit 4

JUnit 4 dodaje obsługę nowych funkcji z języka Java 5.0; testy można zadeklarować za pomocą adnotacji. Jednocześnie istnieje wsteczna kompatybilność z poprzednią wersją frameworka. Prawie wszystkie powyższe przykłady będą działać w JUnit 4, z wyjątkiem RepeatedTest, którego brakuje w nowej wersji.

Jakie zmiany zostały wprowadzone w JUnit 4? Rozważmy ten sam przykład, ale używając nowych funkcji:

Klasa publiczna JUnit4StringUtilsTest rozszerza Assert (prywatna ostateczna mapa toHexStringData \u003d new HashMap (); @Before public static void setUpToHexStringData () (toHexStringData.put ("", nowy bajt); toHexStringData.put ("01020d112d7f", nowy bajt (1,2,13,17,45,127)); toHexStringData.put ("00fff211 , new byte (0, -1, -14,17, -128)); // ...) @After public static void tearDownToHexStringData () (toHexStringData.clear ();) @Test public void testToHexString () (for (Map.Entry entry: toHexStringData.entrySet ()) (final byte testData \u003d entry.getValue (); końcowy String oczekiwany \u003d entry.getKey (); końcowy String rzeczywiste \u003d StringUtils.toHexString (testData); assertEquals (oczekiwany, rzeczywisty);)))

Co się zmieniło w JUnit 4?

  • Aby uprościć pracę, możesz dziedziczyć z klasy Zapewniaćchociaż jest to opcjonalne.
  • adnotacja @Przed oznacza metody, które należy wywołać przed wykonaniem testów. Metody powinny być publiczna nieważność... To tutaj zazwyczaj umieszczane są presety do testu, w naszym przypadku jest to generowanie danych testowych (metoda setUpToHexStringData).
  • Może używać adnotacji @Przed zajęciami, co oznacza metody, które zostaną wywołane przed utworzeniem instancji klasy testowej; metody powinny być publiczna statyczna pustka... Sensowne jest użycie tej adnotacji (metody) do testowania w przypadku, gdy klasa zawiera kilka testów wykorzystujących różne ustawienia wstępne lub gdy kilka testów korzysta z tych samych danych, aby nie tracić czasu na ich tworzenie dla każdego testu.
  • adnotacja @Po oznacza metody, które mają zostać wywołane po wykonaniu testów. Metody powinny być publiczna nieważność... Tutaj umieszczane są operacje zwalniania zasobów po teście; w naszym przypadku kasowanie danych testowych (metoda tearDownToHexStringData).
  • adnotacja @Po zajęciach znacząco związane z @Przed zajęciamiale wykonuje metody po przetestowaniu klasy. Jak z @Przed zajęciamimetody powinny być publiczna statyczna pustka.
  • adnotacja @Test oznacza metody badawcze. Tak jak poprzednio, te metody powinny być publiczna nieważność... Same czeki są tutaj umieszczane. Ponadto ta adnotacja może wykorzystywać dwa parametry, oczekiwany - określa oczekiwany wyjątek i limit czasu - określa czas, po którym test jest uznawany za zakończony niepowodzeniem.

Przykłady użycia adnotacji z parametrami, JUnit Test:

@Test (oczekiwano \u003d NullPointerException.class) public void testToHexStringWrong () (StringUtils.toHexString (null);) @Test (timeout \u003d 1000) public void infinity () (while (true);)

Ignoruj \u200b\u200bwykonanie testu, JUnit Ignore

Jeśli na przykład jeden z testów musi zostać wyłączony z jakiegokolwiek poważnego powodu, test nieustannie kończy się niepowodzeniem. Korektę testu można odłożyć na świetlaną przyszłość, dodając adnotacje @Ignorować... Jeśli umieścisz tę adnotację na klasie, wszystkie testy w tej klasie zostaną wyłączone.

@Ignore @Test (timeout \u003d 1000) public void infinity () (while (true);)

Zasady degustacji, Reguła JUnit

JUnit umożliwia korzystanie z reguł zdefiniowanych przez programistę przed i po wykonaniu testu, co rozszerza funkcjonalność. Na przykład istnieją wbudowane reguły ustawiania limitu czasu testu (Timeout), ustawiania oczekiwanych wyjątków (ExpectedException), pracy z plikami tymczasowymi (TemporaryFolder) itp.

Aby zadeklarować regułę, musisz utworzyć publiczny nie statyczny pole typu pochodzącego z MethodRule i opatrzone adnotacją słowem kluczowym Reguła.

Klasa publiczna JUnitOtherTest (@Rule public final TemporaryFolder folder \u003d new TemporaryFolder (); @Rule public final Timeout timeout \u003d new Timeout (1000); @Rule public final ExpectedException thrown \u003d ExpectedException.none (); @Ignore @Test public void anotherInfinity ( ) (while (true);) @Test public void testFileWriting () rzuca IOException (final File log \u003d folder.newFile ("debug.log"); final FileWriter logWriter \u003d new FileWriter (log); logWriter.append ("Witaj, "); logWriter.append (" World !!! "); logWriter.flush (); logWriter.close ();) @Test public void testExpectedException () rzuca IOException (thrown.expect (NullPointerException.class); StringUtils.toHexString (zero);))

Pakiety testowe, JUnit Suite, SuiteClasses

Uruchomienie testowe można skonfigurować za pomocą adnotacji @Biegnij z... Klasy testowe zawierające metody testowe można łączyć w zestawy testów (pakiet). Na przykład utworzono dwie klasy testów obiektowych: TestFilter, TestConnect. Te dwie klasy testowe można połączyć w jedną klasę testową TestWidgets.java:

Pakiet com.objects; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith (Suite.class) @ Suite.SuiteClasses ((TestFilter.class, TestConnect.class)) public class TestWidgets ()

Adnotacja @SuiteClasses służy do konfigurowania testów do uruchomienia, w tym klas testowych.

Kategorie abstrakcyjne

adnotacja Kategorie umożliwia łączenie testów w kategorie (grupy). Aby to zrobić, test definiuje kategorię @Kategoria, po czym konfigurowane są kategorie testów uruchamiania w pakiecie. Może to wyglądać tak:

Klasa publiczna JUnitStringUtilsCategoriesTest extends Assert (// ... @Category (Unit.class) @Test public void testIsEmpty () (// ...) // ...) @RunWith (Categories.class) @ Categories.IncludeCategory ( Unit.class) @ Suite.SuiteClasses ((JUnitOtherTest.class, JUnitStringUtilsCategoriesTest.class)) public class JUnitTestSuite ()

Streszczenie, parametr JUnit

adnotacja Sparametryzowany umożliwia korzystanie z testów parametryzowanych. W tym celu w klasie testowej deklarowana jest metoda statyczna, która zwraca listę danych, które zostaną użyte jako argumenty dla konstruktora klasy.

@RunWith (Parameterized.class) klasa publiczna JUnitStringUtilsParameterizedTest extends Assert (prywatna ostateczna CharSequence testData; prywatna ostateczna wartość logiczna oczekiwana; publiczna JUnitStringUtilsParameterizedTest (końcowe CharSequence testData, końcowe wartości boolean oczekiwane; this.test. public void testIsEmpty () (final booleantual \u003d StringUtils.isEmpty (testData); assertEquals (oczekiwana, rzeczywista);) @ Parameterized.Parameters public static List isEmptyData () (return Arrays.asList (new Object ((, true), ("", true), ("", false), ("some string", false),));))

Parametryzacja metod: Theories.class, DataPoints, DataPoint, Theory

adnotacja Teorie parametryzuje metodę testową, a nie konstruktora. Dane są oznaczone @Punkty danych i @Punkt danych, metoda testowa - przy użyciu @Teoria... Test wykorzystujący tę funkcję może wyglądać mniej więcej tak:

@RunWith (Theories.class) klasa publiczna JUnitStringUtilsTheoryTest extends Assert (@DataPoints public static Object isEmptyData \u003d new Object (("", true), ("", false), ("some string", false),); @DataPoint public static Object nullData \u003d new Object (, true); @Theory public void testEmpty (final Object ... testData) (final booleantual \u003d StringUtils.isEmpty ((CharSequence) testData); assertEquals (testData ,tual);))

Zlecenie wykonania testu

Jeśli chcesz uruchomić test w określonej kolejności, możesz użyć adnotacji @FixMethodOrder (MethodSorters.NAME_ASCENDING), zdefiniowanej w JUnit 4.11. Na przykład:

@FixMethodOrder (MethodSorters.NAME_ASCENDING) public class MyTest (@Test public void test01 () (...) @Test public void test02 () (...) ... @Test public void test09 () (...) )

W przeciwnym razie można zastosować następujące 2 podejścia.

Void test01 (); void test02 (); ... void test09 (); @Test public void testOrder1 () (test1 (); test3 ();) @Test (oczekiwano \u003d Exception.class) public void testOrder2 () (test2 (); test3 (); test1 ();) @Test (oczekiwano \u003d NullPointerException.class) public void testOrder3 () (test3 (); test1 (); test2 ();)

@Test public void testAllOrders () (for (Object sample: permute (1, 2, 3)) (for (Object index: sample) (switch (((Integer) index) .intValue ()) (case 1: test1 ( ); przerwa; przypadek 2: test2 (); przerwa; przypadek 3: test3 (); przerwa;))))

Lista głównych adnotacji

adnotacjaOpis
@Test
public void testMethod ()
metoda to test
@Test (limit czasu \u003d 100)
public void testMethod ()
jeśli czas wykonania przekroczy parametr timeout, test zakończy się niepowodzeniem
@Test (oczekiwano \u003d MyException.class)
public void testMethod ()
metoda musi zgłosić wyjątek należący do klasy MyException, w przeciwnym razie test zakończy się niepowodzeniem
@Ignorować
public void testMethod ()
zignoruj \u200b\u200bmetodę testową
@Przed zajęciami
metoda, która jest wywoływana raz dla klasy przed wykonaniem metod testowych; tutaj możesz umieścić inicjalizację, którą należy wykonać tylko raz, na przykład odczytać dane, które będą wykorzystane w metodach testowych lub utworzyć połączenie z bazą danych
@Po zajęciach
public static void testMethod ()
metoda wywoływana raz dla klasy po wykonaniu metod testowych; tutaj możesz umieścić deinicjalizację, którą należy wykonać tylko raz, na przykład zamknąć połączenie z bazą danych lub usunąć dane, które nie są już potrzebne
@Przed
public static void beforeMethod ()
metoda wywoływana przed każdą metodą testową w klasie testowej; tutaj możesz wykonać niezbędną inicjalizację, na przykład ustawić parametry początkowe
@Po
public static void afterMethod ()
metoda wywoływana po każdej metodzie testowej w klasie testowej; tutaj możesz wykonać niezbędną deinicjalizację, na przykład usunąć dane, które nie są już potrzebne

Lista typów kontroli Asserts

Sprawdź typOpis
zawieść ()
niepowodzenie (wiadomość tekstowa)
przerwanie testu z błędem, tj. test zakończy się niepowodzeniem
assertTrue (warunek logiczny)
assertTrue (komunikat java.lang.String, warunek logiczny)
sprawdzenie, czy warunek jest równy prawdzie
assertFalse (warunek logiczny)
assertFalse (wiadomość tekstowa, warunek logiczny)
sprawdzenie, czy warunek jest równy fałszowi
assertEquals (<тип> spodziewany,<тип> rzeczywisty)
assertEquals (komunikat typu String,<тип> spodziewany,<тип> rzeczywisty)
test równości;<тип> są Object, int, double itp.
assertArrayEquals (oczekiwane bajty, rzeczywiste wartości bajtów)
assertArrayEquals (komunikat typu String,<тип> oczekiwania,<тип> rzeczywiste)
sprawdzanie tablic pod kątem równości; podobny do assertEquals;<тип> są Object, int, double itp.
assertNotNull (obiekt Object)
assertNotNull (wiadomość tekstowa, obiekt Object)
sprawdzanie, czy Object nie jest null
assertNull (obiekt Object)
assertNull (wiadomość tekstowa, obiekt Object)
sprawdzanie, czy Object ma wartość null
assertSame (oczekiwano obiektu, rzeczywistego obiektu)
assertSame (komunikat typu String, oczekiwany obiekt, rzeczywisty obiekt)
sprawdzenie równości dwóch obiektów oczekiwanych i rzeczywistych, tj. ten sam obiekt

Przykład testowania JUnit

Aby zademonstrować podstawowe cechy JUnit, używamy prymitywnej klasy Java FuncMath, która ma dwie metody - znajdowanie silni liczby nieujemnej i sumy dwóch liczb. Ponadto instancja klasy będzie zawierała licznik wywołań metody.

Klasa publiczna FuncMath (wywołania int; public int getCalls () (wywołania zwrotne;) public long silnia (int liczba) (wywołania ++; if (liczba< 0) throw new IllegalArgumentException(); long result = 1; if (number > 1) (dla (int i \u003d 1; i< = number; i++) result = result * i; } return result; } public long plus(int num1, int num2) { calls++; return num1 + num2; } }

Czasami do wykonania każdego przypadku testowego potrzebny jest kontekst, na przykład instancje klas z wstępnie utworzonymi instancjami. A po wykonaniu musisz zwolnić zarezerwowane zasoby. W takim przypadku używane są adnotacje @Before i @After. Metoda oznaczona @Before zostanie wykonana przed każdym przypadkiem testowym, a metoda oznaczona @After zostanie wykonana po każdym przypadku testowym. Jeśli inicjalizacja i zwolnienie zasobów ma być wykonane tylko raz - odpowiednio przed i po wszystkich testach - użyj pary adnotacji @BeforeClass i @AfterClass.

Klasa testowa z kilkoma skryptami będzie wyglądać następująco:

Import org.junit.Test; import org.junit.After; import org.junit.Before; import org.junit.Assert; import org.junit.AfterClass; import org.junit.BeforeClass; public class JUnit_funcMath extends Assert (private FuncMath math; @Before public void init () (math \u003d new FuncMath ();) @After public void tearDown () (math \u003d null;) @Test public void Calls () (assertEquals (" math.getCalls ()! \u003d 0 ", 0, dao.getConnection ()); math.factorial (1); assertEquals (1, math.getCalls ()); math.factorial (1); assertEquals (2, math. getCalls ());) @Test public void factorial () (assertTrue (math.factorial (0) \u003d\u003d 1); assertTrue (math.factorial (1) \u003d\u003d 1); assertTrue (math.factorial (5) \u003d\u003d 120);) @Test (spodziewane \u003d IllegalArgumentException.class) public void factorialNegative () (math.factorial (-1);) @Ignore @Test public void todo () (assertTrue (math.plus (1, 1) \u003d\u003d 3);))

Metoda call sprawdza poprawność licznika wywołań. Metoda czynnikowa sprawdza, czy silnia jest obliczana poprawnie dla niektórych wartości standardowych. Metoda factorialNegative sprawdza, czy wyjątek IllegalArgumentException zostanie zgłoszony dla ujemnych wartości silni. Metoda todo zostanie zignorowana.

Podsumowując, należy zaznaczyć, że artykuł ten nie obejmuje wszystkich możliwości wykorzystania JUnit. Ale jak widać na powyższych przykładach, framework jest dość łatwy w użyciu, jest kilka dodatkowych funkcji, ale istnieje możliwość rozszerzenia za pomocą reguł i programów uruchamiających.

Uważam, że tworzenie oprogramowania to więcej niż praca. Postrzegam siebie jako rzemieślnika, który każdego dnia stara się być coraz lepszy. Najłatwiej to zrobić, szukając dobrych narzędzi i odpowiadając na następujące pytania:

  • Kiedy należy używać Tool X?
  • Jak używać narzędzia X?

Testowanie automatyczne jest bardzo ważną częścią tworzenia oprogramowania, ale niewiele jest postów na blogu dotyczących narzędzi używanych przez programistów. W tym artykule zajrzysz również do mojego „zestawu narzędzi”. Omówię 12 bibliotek i frameworków, których używam do pisania testów jednostkowych i testów integracji, a także podam linki do stron, które pomogą Ci zrozumieć, jak ich używać.

Rzućmy okiem na mój zestaw narzędzi

Zanim będzie można użyć opisanych poniżej narzędzi, należy skonfigurować kompilację, która automatycznie uruchamia integrację i testy jednostkowe. Mam 2 uwagi na ten temat:

  • Testowanie integracji z Mavenem opisuje, jak możemy skonfigurować kompilację Mavena z integracją i testami jednostkowymi w różnych katalogach.
  • Pierwsze kroki z Gradle: Testowanie integracji z wtyczką TestSets opisuje to samo dla Gradle.

Teraz możesz przyjrzeć się bliżej moim narzędziom. Podzieliłem je na kategorie, aby ułatwić nawigację.

Oto 12 narzędzi, których używam do integracji i testów jednostkowych.

Przeprowadzanie testów

AssertJ zapewnia elastyczny interfejs API do pisania asercji z pomocnymi komunikatami o błędach, poprawia czytelność kodu testowego i umożliwia przekształcenie testów w wykonywalne specyfikacje, które są zgodne z żądanym językiem specyficznym dla domeny.

Do tego:

  • Korzystanie z Hamcrest w testowaniu wyjaśnia, jak używać Hamcrest do pisania testów i jak rozszerzyć jego możliwości za pomocą niestandardowych modułów.
  • Przekształcanie potwierdzeń w język specyficzny dla domeny wyjaśnia, jak tworzyć niestandardowe potwierdzenia w AssertJ.
  • Pisanie czystych testów: zastępowanie asercji językiem specyficznym dla domeny. Wyjaśnia, dlaczego powinniśmy zastąpić standardowe asercje JUnit naszymi własnymi, które używają prawidłowego języka specyficznego dla domeny.

Testowanie kodu dostępu do danych

Szybka baza danych przydatna do pisania testów integracyjnych, które są uruchamiane na lokalnym komputerze deweloperskim.

Rozszerzenie dla JUnit, którego można użyć do zainicjowania bazy danych do znanego stanu przed wykonaniem każdego testu integracji i zapełnieniem bazy danych wymaganymi danymi. DbUnit ma swoje wady, ale jest bardzo przydatnym narzędziem do oddzielania danych testowych od kodu testowego.

Do tego:

  • opisuje kluczowe składniki DbUnit, które trzeba znać, aby pisać testy przy użyciu DbUnit.
  • zawiera pięć zasad pisania najlepszych testów kodu dostępu do danych.

DZWON

Są tacy, którzy czytają tę wiadomość przed tobą.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać The Bell
Bez spamu