Wątek przeniesiony 2020-03-08 22:38 z Java przez Shalom.

Granice testów jednostkowych

Odpowiedz Nowy wątek
2020-03-06 14:04

Rejestracja: 4 tygodnie temu

Ostatnio: 2 tygodnie temu

0

Czy pisząc test dla danej metody z jakiegoś serwisu uderzając do testowej bazy danych to nadal test jednostkowy? Czy już integracyjny? Gdzie zaczynają są granice testów jednostkowych? Czy pisząc taki test powinno się mockować odpowiedź czy używać bazy danych?

Dobre pytanie, też się chętnie dowiem gdzie są te granice. :) - Michał Sikora 2020-03-06 14:18

Pozostało 580 znaków

2020-03-07 12:29

Rejestracja: 5 lat temu

Ostatnio: 12 godzin temu

0
Shalom napisał(a):

W Twoim przypadku jeśli doszło by do jeszcze kilku innych warunków to przecież żeby każdą ścieżkę przerobić byłoby potrzebne tysiące testów

To znaczy ze masz *ujowy design jak masz milion warunków ;)

To mógłbyś pokazać na podanym przykładzie jak to zrobić inaczej?

Przecież mam test, który sprawdza widok w kilku przypadkach

W kilku wybranych xD sprawdzasz kro i mer a innych już nie. Jakiś geniusz wywalił przypadkiem obsługę pozostałych a ty nawet o tym nie wiesz :D

Przecież właśnie po to jest osobny test, który sprawdzi czy wszystko działa. Owszem ten jeden test dla kro przejdzie a inne się wywalą jak ktoś sknoci i wiemy, że działa/nie działa dzięki temu.

Mógłbyś pokazać przykład takiego sparametryzowanego testu na moim przykładzie jak to powinno wyglądać według Ciebie?

Serio? Przecież widzisz że wszystkie te testy wyglądają identyczne. Zrób w takim razie argumenty do nich...

To jak rozwiązałbyś tu nazewnictwo? Przecież subtesty nie będą miały swojej nazwy w takim przypadku?

Oczywiście że mogą mieć. Ale to już ograniczenie twojego frameworka. W javie nie ma z tym problemu, JUnit wspiera nazewnictwo parametryzowanych testów. - Shalom 2020-03-07 12:33
Zawsze jednym z parametrów może być nazwa przypadku/testu którą będziesz logował... - Inject 2020-03-07 12:34
Czyli żaden z was nie pomógłby podając przykład? - anonimowy 2020-03-07 12:35

Pozostało 580 znaków

2020-03-07 15:17

Rejestracja: 3 lata temu

Ostatnio: 11 godzin temu

Lokalizacja: Kraków

0

@anonimowy: Wersja easy:

public class AdditionTest {

    public long add(long a, long b){
        return a + b;
    }

    @Test
    void shouldAddZeros(){
        testAdd(0, 0, 0);
    }

    @Test
    void shouldAddNegatives(){
        testAdd(-5, -5, -10);
    }

    void testAdd(long a, long b, long expectedResult){
        long result = add(a, b);
        Assertions.assertThat(result).isEqualTo(expectedResult);
    }
}

Wersja JUnit5 + Enum:

public class AdditionTest {

    public long add(long a, long b){
        return a + b;
    }

    enum Scenario {
        ZEROS(0 , 0, 0),
        NEGATIVES(-5, -5, -10);

        Scenario(long first, long second, long expectedResult) {
            this.first = first;
            this.second = second;
            this.expectedResult = expectedResult;
        }

        long first;
        long second;
        long expectedResult;
    }

    @ParameterizedTest
    @EnumSource(Scenario.class)
    void shouldAddCorrectlyAllScenarios(Scenario scenario){
        long result = add(scenario.first, scenario.second);
        Assertions.assertThat(result).isEqualTo(scenario.expectedResult);
    }
}

"Gdy się nie wie, co się robi, to się dzieją takie rzeczy, że się nie wie, co się dzieje"


edytowany 5x, ostatnio: nie100sowny, 2020-03-07 15:22

Pozostało 580 znaków

2020-03-07 15:47

Rejestracja: 3 lata temu

Ostatnio: 10 godzin temu

0

Pisanie w JUnit to nieporozumienie :P
Wersja Spock:

class AdditionTest extends Specification {

    long add(long a, long b) {
        return a + b;
    }

    @Unroll("#a + #b = #sum")
    def "Should add two numbers"() {
        expect:
        add(a, b) == sum

        where:
        a  | b  | sum
        1  | 2  | 3
        0  | 0  | 0
        -5 | -5 | -10
    }
}
Pokaż pozostałe 5 komentarzy
What? Przecież to nie ja zarządzam jaki JDK ma klient u siebie, jedynie musi zgadzac sie numerek. - scibi92 2020-03-07 21:35
Rozsądny klient, który chce używać OpenJDK by Oracle, które przytaczasz, będzie podnosił wersję javy co pół roku. No chyba, że wykorzysta AdoptOpenJDK, ale z ankiet na razie wynika, że to 10%. - nie100sowny 2020-03-07 22:04
Oraclowy Support Javy 11 jest do 2023 tak tylko powiem - scibi92 2020-03-07 22:47
Mylisz OracleJDK z OpenJDK build by Oracle tak tylko powiem. - nie100sowny 2020-03-08 00:19
Nie mylę :) - scibi92 2020-03-08 01:05

Pozostało 580 znaków

2020-03-07 15:49

Rejestracja: 5 lat temu

Ostatnio: 12 godzin temu

0

No dobrze na trywialnym przykładzie to może działać ale w przypadku zagmatwanej logiki biznesowej gdzie musisz ustawiać różnie dane w bazie nie do końca można to sparametryzować

Pokaż pozostałe 4 komentarze
@anonimowy: i jedna metoda w API robi to na 500 sposobów u Ciebie? - Inject 2020-03-08 16:40
@Inject: nie musi być 500 sposobów tylko 500 ścieżek a o to nie ciężko - anonimowy 2020-03-08 17:15
@anonimowy. Czyli w teście robisz findById i sprawsza czy obiekt jest .equals - jedna asercja. - nie100sowny 2020-03-09 00:10
O matko, przecież jest tyle możliwości, że aż szkoda o tym pisać a sprowadzasz to do prostego porównania obiektów, tak to może działać w jakimś CRUD, który sam się testuje - anonimowy 2020-03-09 01:40
Trzeba założyć nowy temat "Granice CRUDa" - Inject 2020-03-09 09:02

Pozostało 580 znaków

2020-03-07 17:53

Rejestracja: 12 lat temu

Ostatnio: 9 minut temu

0

IMO testy jednostkowe trzeba pisać tak, aby wykonanie wszystkich testów jednostkowych w aplikacji/usłudze trwało max. 5-10 sekund. Wtedy jestem w stanie odpalać je bardzo często i robić TDD. Jak integracyjny będzie się wykonywał powiedzmy 3 sekundy, to dla mnie nie jest problem, ale to mało realne.


Ivory Tower Architect
To zaraz Shalom Ci napisze, że u niego 500 testów integracyjnych wykonuje się max 5s... - anonimowy 2020-03-07 18:47
Jak masz 500 to klepiesz jakiś mother of of monoliths i masz większe problemy niż kilka sekund trwania testów xD - Shalom 2020-03-07 18:49
@anonimowy: Shalom nie testuje jakichś tam miernych niebiznesowych ścieżek, dlatego testuje na produkcji i oszczędza czas ;) - WeiXiao 2020-03-07 21:39

Pozostało 580 znaków

2020-03-08 21:27

Rejestracja: 4 lata temu

Ostatnio: 3 dni temu

2
jarekr000000 napisał(a):

@anonimowy: dokładnie tyle samo. Jeśli jako możliwości masz na myśli ścieżki. Jeśli masz na myśli wszystkie inputy (np. dla Int) ... to żadne testowanie Ci tego łatwo nie zapewni.

Nieprawda. Istnieje calkiem spora dziedzina IT zajmujaca sie formalnymi metodami dowodzenia poprawnosci dzialania programow.

Osobisie dziele testy na 4 kolejne etapy:
unit -> property based -> modeling (TLA+) -> formal proof

Polecam zwlaszcza jezyki typu TLA+ do otestowania zlozonych systemow rozproszonych, albo skomplikowanych ppd wzgledem wielowatkowosci, wspolbieznosci. Pan Klepman ma fajne konferencyjne wystapienia na ten temat - do znalezienia na YT.

edytowany 1x, ostatnio: InterruptedException, 2020-03-08 21:27
ile razy użyłeś TLA+ i ile czasu pochłania Ci używanie go do testów? - WeiXiao 2020-03-09 01:45

Pozostało 580 znaków

Odpowiedz

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