Nie jestem inżynierem oprogramowania. Jestem doktorantem z dziedziny geologii.
Prawie dwa lata temu zacząłem programować oprogramowanie naukowe. Nigdy nie korzystałem z ciągłej integracji (CI), głównie dlatego, że na początku nie wiedziałem, że istnieje i byłem jedyną osobą pracującą nad tym oprogramowaniem.
Ponieważ baza oprogramowania działa, inni ludzie zaczynają się nim interesować i chcą wnieść swój wkład w oprogramowanie. Plan jest taki, że inne osoby na innych uniwersytetach wdrażają dodatki do podstawowego oprogramowania. (Boję się, że mogą wprowadzić błędy). Ponadto oprogramowanie stało się dość złożone i coraz trudniejsze do przetestowania, a także planuję kontynuować pracę nad nim.
Z tych dwóch powodów coraz częściej zastanawiam się nad użyciem CI. Ponieważ nigdy nie miałem wykształcenia inżyniera oprogramowania i nikt wokół mnie nie słyszał o CI (jesteśmy naukowcami, nie ma programistów), ciężko jest mi zacząć projekt.
Mam kilka pytań, na które chciałbym uzyskać porady:
Przede wszystkim krótkie wyjaśnienie działania oprogramowania:
Oprogramowanie jest kontrolowane przez jeden plik .xml zawierający wszystkie wymagane ustawienia. Oprogramowanie uruchamia się po prostu przekazując ścieżkę do pliku .xml jako argument wejściowy, a on uruchamia się i tworzy kilka plików z wynikami. Jedno uruchomienie może potrwać ~ 30 sekund.
To oprogramowanie naukowe. Prawie wszystkie funkcje mają wiele parametrów wejściowych, których typami są w większości klasy dość złożone. Mam wiele plików .txt z dużymi katalogami, które są używane do tworzenia instancji tych klas.
Teraz przejdźmy do moich pytań:
testy jednostkowe, testy integracyjne, testy kompleksowe? : Moje oprogramowanie ma teraz około 30 000 linii kodu z setkami funkcji i ~ 80 klasami. To dziwne, że zaczynam pisać testy jednostkowe dla setek już zaimplementowanych funkcji. Pomyślałem więc o stworzeniu kilku przypadków testowych. Przygotuj 10–20 różnych plików .xml i uruchom oprogramowanie. Sądzę, że nazywa się to testami end-to-end? Często czytam, że nie powinieneś tego robić, ale może na początek jest dobrze, jeśli masz już działające oprogramowanie? Czy jest to po prostu głupi pomysł, aby spróbować dodać CI do już działającego oprogramowania.
Jak piszesz testy jednostkowe, jeśli parametry funkcji są trudne do utworzenia? Załóżmy, że mam funkcję
double fun(vector<Class_A> a, vector<Class_B>)
i zwykle musiałbym najpierw przeczytać w wielu plikach tekstowych, aby utworzyć obiekty typuClass_A
iClass_B
. Pomyślałem o stworzeniu niektórych fikcyjnych funkcji, takich jakClass_A create_dummy_object()
bez wczytywania plików tekstowych. Pomyślałem także o wdrożeniu pewnego rodzaju serializacji . (Nie planuję testować tworzenia obiektów klasy, ponieważ zależą one tylko od wielu plików tekstowych)Jak pisać testy, jeśli wyniki są bardzo zmienne? Moje oprogramowanie wykorzystuje duże symulacje Monte Carlo i działa iteracyjnie. Zwykle masz ~ 1000 iteracji i przy każdej iteracji tworzysz ~ 500-20 000 instancji obiektów na podstawie symulacji Monte Carlo. Jeśli tylko jeden wynik jednej iteracji jest nieco inny, całe nadchodzące iteracje są zupełnie inne. Jak sobie radzisz z tą sytuacją? Myślę, że to duża zaleta w porównaniu z testami typu end-to-end, ponieważ wynik końcowy jest bardzo zmienny?
Wszelkie inne porady z CI są bardzo mile widziane.