Testy jednostkowe - podstawowe pytania

0

Cześć, chciałem Wam zadać kilka pytań co do testowania, bo nie za bardzo wiem do kogo się zwrócić. Mianowicie mam taki test:

public class GCSQLInterfaceTest {
    GCSQLInterface instance;

    public GCSQLInterfaceTest() throws SQLException, ClassNotFoundException {
        try{
          instance = new GCSQLInterface("localhost", "test", "testuser", "pass");
        }catch(SQLException | ClassNotFoundException e){
            System.out.println(e.getMessage());
            fail("No connection to database");
        }
    }

    @BeforeClass
    public static void setUpClass() {
    }

    @AfterClass
    public static void tearDownClass() {
    }

    @Before
    public void setUp() {
    }

    @After
    public void tearDown() {
    }

    /**
     * Test of addFriend method, of class GCSQLInterface.
     */
    @Test
    public void testAddFriend() {
        System.out.println("addFriend");
        String user = "Janusz";
        String[] friends = new String[10];
        friends[0] = "Maciej";

        for(int i =1;i<friends.length;++i){
            friends[i] = friends[i-1]+"a";
        }
        for(int i = friends.length-1;i>=0;--i){
            instance.addFriend(user, friends[i]);
        }

        String expectedFriends[] = instance.getFriendsArr(user);
        assertArrayEquals(expectedFriends, friends);

    }

}

Metoda void addFriend(String login1,String login2) dodaje kontakt o nazwie login2 dla użytkownika o nazwie login1
Metoda getFriendsArr(String login) zwraca listę kontaktów dla użytkownika o nazwie login

Muszę napisać testy jednostkowe i chodzi o to, że:

  1. Za każdym razem powinienem sprawdzać różne przypadki każdej metody, każdy przypadek powinien być osobnym testem czy wszystko w jednym ?
  2. W przypadku stringów jakie będą przypadki ? Po pierwsze normalne argumenty, później puste stringi, coś jeszcze ? Dobrze myślę ?
  3. Co w przypadku powyższej metody addUser ? Chciałbym sprawdzić czy działa poprawnie, ale jednocześnie żeby to zrobić, to używam innej metody czyli w sumie sprawdzam już dwie metody tak naprawdę, czy taki test jednostkowy jest w porządku ?
    Z góry dziękuję za odpowiedź.

dodanie znacznika <code class="java"> - furious programming

0

Każdy test powinien sprawdzać tylko jedną funkcjonalność. Jeśli chcesz w jednym teście sprawdzać kilka przypadków, możesz użyć data provider'ów - w przykładzie poniżej test zostanie wykonany dla wszystkich danych zwróconych z createData().

public Object[][] createData() {
 return new Object[][] {
   { "Janusz", new Integer(1) },
   { "Maciej", new Integer(2)},
 };
}

@Test(dataProvider = "test1")
public void verifyData(String n1, Integer n2) {
 // weryfikacja
} 

Testując stringi (chociaż to się tyczy większości testów) sprawdzasz warunki brzegowe - co w przypadku gdy przyjdzie null lub pusty ciąg. Możesz sprawdzać ich długość (czy mieści się w granicach rozsądku) lub czy nie zawierają niedozwolonych znaków.

Edit: Generalnie jeszcze w testach jednostkowych powinieneś unikać operacji na bazie danych - w miejsce tego powinieneś używać mocków.

0

Jedną funkcjonalność, to teraz pytanie, pobieranie kontaktów z bazy i dodawanie kontaktów do bazy to jedna funkcjonalność czy dwie osobne ? Czy powinno to wynikać ze specyfikacji projektu ?

0

Pobieranie i zapisywanie to z definicji dwie rozne funkcjonalnosci

0

Funkcje, nie funkcjonalności. Funkcjonalność to zbiór wszystkich funkcji całej aplikacji.

W jedynym teście jednostkowym testuje się wywołanie jednej metody z parametrami i sprawdza, czy zwróciła oczekiwany wynik.
Jeśli testujesz więcej niż jedną metodę, to masz już testy integracyjne.

0

To jak sprawdzić metodą void ?

0

Na pewno nie jednostkowo.
Co ten Twój void robi?

0

void addFriend(String login1,String login2)
Dodaje kontakt o nazwie login2 dla uzytkownika o nazwie login1. Dodaje - mam na myśli dodaje do bazy danych.

0

Jeśli ta metoda operuje na jakimś repozytorium, które mockujesz w testach, to możesz jedynie sprawdzić, czy odpowiednia jego metoda została wywołana.

Jeśli chcesz testować operacje na bazie danych, to to już nie są testy jednostkowe. Testowanie CRUDu zazwyczaj też nie ma sensu.

0

Czyli rozumiem, że operacji typu dodaj, odczytaj itd. na bazie nie poddawać testowaniu jednostkowemu, tak ? A metody prywatne powinno się testować czy nie ?

0

W testach jednostkowych operacje na bazie danych sa mockowane (tworzone sa sztuczne obiekty, ktore symuluja dostep do bazy a w istocie zwracaja twoj 'podstawiony' obiekt).
Metod prywatnych sie nie testuje. Sa one wykorzystywane wewn. metod publicznych, wiec sa one niejawnie testowane podczas testow tych metod.

0
Ąowski napisał(a):

Czyli rozumiem, że operacji typu dodaj, odczytaj itd. na bazie nie poddawać testowaniu jednostkowemu, tak ?

Nie widzę sensu w testowaniu takiego czegoś jednostkowo. Prędzej podczas testów integracyjnych, aby sprawdzić, czy obiekt jest prawidłowo konwertowany na tabelę. Ale jeśli używamy jakiegoś ORMa, to takie testy raczej nie mają sensu.

A metody prywatne powinno się testować czy nie ?

To jest w sumie drażliwy temat, właściwie dobry na flejma.
Generalnie, jeśli metoda prywatna jest tak skomplikowana, że warto ją oddzielnie testować, to lepiej przenieść ją do klasy pomocniczej i upublicznić.

qweqeq napisał(a):

W testach jednostkowych operacje na bazie danych sa mockowane (tworzone sa sztuczne obiekty, ktore symuluja dostep do bazy a w istocie zwracaja twoj 'podstawiony' obiekt).

Można je mockować, o ile się da. Jeśli ktoś konkatenuje sobie zapytania sql w kodzie, to raczej niczego nie zamockuje.

0
somekind napisał(a):

Można je mockować, o ile się da. Jeśli ktoś konkatenuje sobie zapytania sql w kodzie, to raczej niczego nie zamockuje.

I tak dochodzimy do kolejnej rzeczy - zeby kod testowac jednostkowo, to musi byc w odpowiedni sposob napisany (zeby testy jednostkowe byly w ogole mozliwe do przeprowadzenia).

0

A jeśli jakaś metoda jest void, ale wypisuje na ekran komunikaty ? Sprawdza sie to czy zakłada, że metoda jest źle napisana do testowania jednostkowego ?

0

No testu black box nie zrobisz, ale możesz testować zachowanie jak najbardziej. Możesz za pomocą mockow sprawdzić czy dla zadanych argumentów przechodzisz taka ścieżkę jaką powinieneś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1