Gdzie mam przechowywać dane testowe?

9

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.

Zgodnie z tym postem programistów powinienem przechowywać wszystkie moje dane potrzebne do przetestowania projektu w repozytorium.

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?

AlexLordThorsen
źródło
1
Jak często dane testowe mogą się zmieniać?
Robert Harvey
Prawdopodobnie nigdy się nie zmieni, ale w miarę łatania błędów lub dodawania funkcji może zostać dodane więcej danych.
AlexLordThorsen
1
Oto niektóre z kompromisów: stackoverflow.com/q/984707
Robert Harvey
1
Niezależnie od tego, co trzyma git, czy rozważałeś z punktu widzenia tego, że pełny zestaw danych z danych na żywo nie jest zestawem danych testowych (zaprojektowanych do testowania zarówno stanów powodzenia, jak i awarii) i że sam ten może być silnym argumentem za tym, aby można go było przechowywać poza repozytorium?
James Snell,
Testy jednostkowe nie powinny wykorzystywać tak dużej ilości danych. Można sobie wyobrazić, że mogą to zrobić testy integracyjne.
raptortech97

Odpowiedzi:

9

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.

ptyx
źródło
3

Gdy NAS nie działa, działa wolno lub jest niesprawny, nie możemy przeprowadzić pełnego testu.

Oczywiście można to rozwiązać tylko poprzez skopiowanie 5 GB z NAS na dysk lokalny. Ale nie trzeba tego robić ręcznie.

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.

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.

Doktor Brown
źródło
3

... kiedy ktoś po raz pierwszy sklonuje 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.

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.

  • oddzielić dwa rodzaje testów w kodzie (konwencja nazewnictwa, oddzielny projekt, ...)
  • zapewniają sposób przeprowadzenia tylko jednego z dwóch pakietów testów
  • uruchamiaj tylko testy jednostkowe podczas normalnych kompilacji
  • uruchom testy integracji na żądanie i na serwerze CI (ciągła integracja)

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 :-).

Śleske
źródło