- To pytanie nie dotyczy ram testowania jednostek.
- To pytanie nie dotyczy pisania testów jednostkowych.
- To pytanie dotyczy tego, gdzie umieścić kod UT i jak / kiedy / gdzie go skompilować i uruchomić.
W Praca Skutecznie z Kodeksem Legacy , Michael Feathers twierdzi, że
dobre testy jednostkowe ... działają szybko
i to
Test jednostkowy trwający 1/10 sekundy to powolny test jednostkowy.
Myślę, że te definicje mają sens. Myślę też, że implikują, że musisz zachować zestaw testów jednostkowych i zestaw tych testów kodu, które trwają dłużej osobno, ale sądzę, że to cena, którą płacisz za nazwanie czegoś tylko testem jednostkowym, jeśli przebiega (bardzo) szybko .
Oczywiście problemem w C ++ jest to, że do "run" Urządzenie Test ( s ), trzeba:
- Edytuj kod (produkcja lub test jednostkowy, w zależności od tego, w jakim „cyklu” jesteś)
- Skompilować
- Połączyć
- Rozpocznij Test jednostki wykonywalny ( s )
Edytuj (po dziwnym zamkniętym głosowaniu) : Zanim przejdę do szczegółów, postaram się streścić tutaj:
W jaki sposób można skutecznie zorganizować kod testu jednostkowego C ++, aby zarówno edycja (testowa) kodu, jak i uruchomienie kodu testowego były efektywne?
Pierwszym problemem jest więc zdecydować , gdzie umieścić kod jednostki testowej, tak aby:
- „naturalne” jest edytowanie i wyświetlanie w połączeniu z powiązanym kodem produkcyjnym.
- łatwo / szybko rozpocząć cykl kompilacji dla aktualnie zmienianej jednostki
Sekund związanym z tym problemem jest więc co do kompilacji tak, że opinia jest natychmiastowa.
Ekstremalne opcje:
- Każda jednostka-test-test-jednostka znajduje się w osobnym pliku cpp, a ten plik cpp jest kompilowany + połączony osobno (wraz z testowanym plikiem źródłowym jednostki kodu) do jednego pliku wykonywalnego, który następnie uruchamia ten jeden test jednostki.
- (+) Minimalizuje to czas uruchamiania (kompilacja + link!) Dla pojedynczej jednostki testowej.
- (+) Test przebiega bardzo szybko, ponieważ testuje tylko jedną jednostkę.
- (-) Wykonanie całego pakietu będzie wymagało uruchomienia bazillionu procesów. Problemem może być zarządzanie.
- (-) Koszt rozpoczęcia procesu stanie się widoczny
- Drugą stroną byłoby posiadanie - nadal - jednego pliku cpp na test, ale wszystkie testowe pliki cpp (wraz z testowanym kodem!) Są połączone w jeden plik wykonywalny (na moduł / na projekt / wybór).
- (+) Czas kompilacji nadal będzie OK, ponieważ skompiluje się tylko zmieniony kod.
- (+) Wykonanie całego pakietu jest łatwe, ponieważ jest tylko jeden plik exe do uruchomienia.
- (-) Łączenie zestawu zajmie wieki, ponieważ każda ponowna kompilacja dowolnego obiektu spowoduje ponowne połączenie.
- (-) (?) Uruchomienie kombinezonu potrwa dłużej, chociaż jeśli wszystkie testy jednostkowe są szybkie, czas powinien być OK.
Jak zatem przeprowadzane są testy jednostkowe C ++ w świecie rzeczywistym ? Jeśli uruchamiam te rzeczy co noc / co godzinę, druga część nie ma tak naprawdę znaczenia, ale pierwsza część, a mianowicie, jak „połączyć” kod UT z kodem produkcyjnym, tak aby „naturalne” dla programistów trzymanie obu skupienie zawsze ma znaczenie. (A jeśli programiści skupią się na kodzie UT, będą chcieli go uruchomić, co spowoduje powrót do drugiej części).
Doceniamy prawdziwe historie i doświadczenie!
Uwagi:
- To pytanie celowo pozostawia nieokreśloną platformę i system make / project.
- Pytania oznaczone UT i C ++ to świetne miejsce do rozpoczęcia, ale niestety zbyt wiele pytań, a zwłaszcza odpowiedzi, jest zbyt mocno skoncentrowanych na szczegółach lub konkretnych ramach.
- Jakiś czas temu odpowiedziałem na podobne pytanie dotyczące struktury testów jednostek doładowania. Uważam, że brakuje tej struktury do „prawdziwych”, szybkich testów jednostkowych. Drugie pytanie uważam za zbyt wąskie, stąd nowe pytanie.
:-(
Gdzie masz szukać odpowiedzi na takie pytania, jeśli nie na tym forum?
Pipeline<A,B>.connect(Pipeline<B,C>)
powinien się kompilować, Pipeline<A,B>.connect(Pipeline<C,D>)
ale nie powinien się kompilować: Typ wyjściowy pierwszego stopnia jest niezgodny z typem wejściowym drugiego stopnia.