Mam mniejsze testy jednostkowe, które używają małych fragmentów z prawdziwych zestawów danych. Chciałbym również przetestować mój program pod kątem pełnych zestawów danych z wielu powodów. Jedynym problemem jest to, że pojedynczy prawdziwy zestaw danych ma około ~ 5 GB. Nie znalazłem żadnych twardych liczb, które mogłyby przechowywać repozytoria Git, ale wydaje się, że to za dużo.
Rozwiązanie przyjęte przez mój zespół polega na tym, że projekt ma plik zawierający ścieżkę do podłączonego do sieci systemu plików, który przechowuje nasze dane testowe. Plik jest ignorowany przez Gita.
Wydaje mi się, że jest to niedoskonałe rozwiązanie z dwóch powodów. Gdy NAS nie działa, działa wolno lub jest niesprawny, nie możemy przeprowadzić pełnego testu. Drugim powodem jest to, że gdy ktoś po raz pierwszy klonuje repozytorium, testy jednostkowe kończą się niepowodzeniem, więc muszą dowiedzieć się, jak zamontować rzeczy o określonej nazwie i składni użytej do zbudowania pliku ścieżki testowej.
Więc moje pytanie jest dwojakie. Ile danych to za dużo danych, aby je zapisać w kontroli wersji?
Jaki jest lepszy sposób obsługi dużych ilości danych testowych?
Odpowiedzi:
Jak obsługiwać duże pliki w łańcuchu kompilacji
Lubię używać narzędzia do budowania, które zarządza zależnościami - na przykład maven lub gradle. Pliki są przechowywane w repozytorium internetowym, a narzędzie automatycznie pobiera i buforuje, gdy napotka zależność. Eliminuje to także dodatkową konfigurację (konfigurację NAS) dla osób, które chcą uruchomić test. I sprawia, że odświeżanie danych jest dość bezbolesne (jest wersjonowane).
Co jest zbyt duże, aby wprowadzić kontrolę wersji
Jest duży szary obszar. A jeśli zdecydujesz, że coś nie należy do RCS, jakie masz alternatywy? Jest to łatwiejsza decyzja, jeśli ograniczysz wybory między RCS a binarnym repo (styl maven).
Idealnie byłoby, gdybyś chciał tylko w RCS rzeczy, które można edytować w sposób humanitarny, możliwych do modyfikacji lub w których chcesz śledzić historię. Cokolwiek, co jest produktem kompilacji lub innego rodzaju automatyzacji, zdecydowanie nie należy do tego. Rozmiar jest ograniczeniem, ale nie głównym - gigantyczny plik źródłowy (zła praktyka) zdecydowanie należy do kontroli źródła. Mały skompilowany plik binarny nie.
Przygotuj się na kompromis dla wygody programisty.
źródło
Oczywiście można to rozwiązać tylko poprzez skopiowanie 5 GB z NAS na dysk lokalny. Ale nie trzeba tego robić ręcznie.
Możesz podać prosty skrypt powłoki, który właśnie to robi - zamontuj serwer NAS o określonej nazwie i skopiuj dane na dysk lokalny, gdy go jeszcze nie ma lub gdy zestaw danych na serwerze NAS jest nowszy niż lokalny zestaw danych. Upewnij się, że skrypt uruchomi się automatycznie podczas etapu inicjalizacji testów jednostkowych.
Oczywiście, gdy istnieje nie tylko jeden z tych zestawów danych, ale cała gama zależności od plików zewnętrznych poza repozytorium kodu źródłowego, lepszym rozwiązaniem może być narzędzie takie jak wymienione przez @ptyx.
źródło
Po pierwsze, aby mieć spójną terminologię: ten rodzaj testu (duże zależności zewnętrzne, rzeczywiste dane) zwykle nie jest uważany za test jednostkowy, ale raczej za test integracyjny lub systemowy .
Praktycznie: uważam, że dobrą praktyką jest oddzielanie testów jednostkowych i integracyjnych , ponieważ mają one różne mocne i słabe strony.
W ten sposób lokalne kompilacje są szybkie i niezawodne (niewielkie / żadne zależności zewnętrzne), a testy integracji są obsługiwane przez rozbudowany serwer CI. Pozwala to uniknąć opisanego problemu.
Co do sposobu przechowywania danych:
Jedną z dobrych opcji jest zarządzanie artefaktami, jak opisuje odpowiedź ptyx. Innym byłoby umieszczenie danych testowych w osobnym repozytorium . Poza tym dane nie są publikowane razem z kompilacją główną, a osobne repo pozwala uniknąć zmuszania wszystkich do pobrania danych testowych wraz z kodem źródłowym. Innymi słowy, użyj drugiego repozytorium jako zarządzania artifacdt :-).
źródło