JavaRush /Blog Java /Random-PL /Przerwa kawowa #87. Dlaczego testy jednostkowe są ważne d...

Przerwa kawowa #87. Dlaczego testy jednostkowe są ważne dla programistów? 5 sposobów kopiowania tablicy w Javie

Opublikowano w grupie Random-PL

Dlaczego testy jednostkowe są ważne dla programistów?

Źródło: SearchSoftwareQuality Porozmawiajmy, dlaczego testowanie jednostkowe jest ważne i cenne oraz w jaki sposób ułatwia debugowanie. Testowanie jednostkowe jest potężnym narzędziem poprawiającym jakość oprogramowania. Testy jednostkowe zapewniają podstawową weryfikację, czy aplikacja jest zgodna ze specyfikacjami oprogramowania i zachowuje się zgodnie z przeznaczeniem. Przerwa kawowa #87.  Dlaczego testy jednostkowe są ważne dla programistów?  5 sposobów kopiowania tablicy w Javie — 1Po dobrym wykonaniu testy jednostkowe:
  • zmniejszyć liczbę defektów i zidentyfikować je na wczesnych etapach cyklu życia oprogramowania;
  • poprawić czytelność kodu;
  • zezwalaj na ponowne wykorzystanie kodu;
  • zwiększyć szybkość wdrażania.
Przyjrzyjmy się, dlaczego testy jednostkowe są ważne, skąd wziął się ten typ testów i jakie są bariery w jego wdrażaniu.

Historia testów jednostkowych

Błąd wykryty na wczesnym etapie oszczędza czas i wysiłek. Przez pierwsze 50 lat historii komputerów testowanie jednostkowe i debugowanie były w zasadzie tym samym. Jednak w latach 90. kod stał się tak skomplikowany, że często niemożliwe było podzielenie systemu na małe części w celu uruchomienia ich w izolacji. W 1997 roku programista Kent Beck stworzył JUnit, wtyczkę do środowiska programistycznego do testowania małych fragmentów kodu. Kod testowy, który ocenia kod źródłowy, nazywa się testami jednostkowymi. Ten typ testów jednostkowych stał się podstawą przez wiele lat. Po tym, jak Beck stworzył JUnit, Martin Fowler napisał książkę Refactoring, w której zaproponował sposoby przekształcania kodu, aby uczynić go bardziej izolowanym i testowalnym. Połączenie refaktoryzacji kodu i testów jednostkowych doprowadziło do rozwoju opartego na testach, w którym tworzenie testów jednostkowych jest niezbędne w procesie programowania. W nim kod musi być testowalny jeszcze przed jego utworzeniem. Zatem proces programowania nie jest zakończony, dopóki nie zostaną uruchomione testy jednostkowe. Projekt może następnie przejść do etapu badań na poziomie systemowym lub ludzkim.

Przykład testowania jednostkowego

Ten przykład pokazuje znaczenie testów jednostkowych. Tutaj JUnit ocenia prostą funkcję, która konwertuje temperaturę ze stopni Fahrenheita na stopnie Celsjusza. Wzór przeliczeniowy: C = (F-32) * 5/9. Zaledwie kilka wierszy, łącznie z sygnaturą funkcji i nawiasami klamrowymi, można zaimplementować w kodzie jako funkcję biblioteczną. Jednakże z funkcji nie wynika jasno, że są to kryteria. Opcje te mogą obejmować zaokrąglanie w górę lub w dół, liczby rzeczywiste lub górne i dolne limity. Stwórzmy przykładowe testy jednostkowe dla tej funkcji konwersji temperatury w Perlu za pomocą modułu Test::More. Pierwsza linia to komentarz, który mówi programiście, czego się spodziewać po pozostałym kodzie.
# is (input, expected result, comment)
is( FtoC(32),0,'Freezing point is F32, C 0');
is( FtoC(212),100,'Boiling point is F212, C 100');
is( FtoC(59038),32767, 'Upper limit of C is 32767');
is( FtoC(59039),undefined, 'One past upper limit is error');
Framework JUnit opiera się na systemach obiektowych i obiektach testowych, ale koncepcja jest podobna.

Izolowane testy jednostkowe

Jedną z zalet testów jednostkowych jest to, że izolują funkcję, klasę lub metodę i testują tylko ten fragment kodu. Lepsze poszczególne komponenty zapewniają ogólną odporność systemu. W ten sposób otrzymasz niezawodny kod. Testy jednostkowe zmieniają także charakter procesu debugowania. Aby spróbować naprawić błąd, programiści po prostu piszą test, który kończy się niepowodzeniem, a następnie powtarzają go, tak aby zaliczył test bez naruszania wcześniejszych oczekiwań. Proces ten eliminuje ręczny cykl tradycyjnego debugowania poprzez konfigurację, ponowne utworzenie, wstrzymywanie i testowanie. Aby zmienić kod tak, aby nadawał się do testów jednostkowych, programiści muszą zmienić sposób swojej pracy. Wszelkie fragmenty kodu napisane bez testów jednostkowych prawdopodobnie zostaną uznane za nieprzetestowane, przynajmniej jako pojedyncze moduły.

Adaptacja testów jednostkowych

Starsze oprogramowanie to oprogramowanie, które działało przez długi czas i najprawdopodobniej zostało napisane bez testów jednostkowych. Starszy kod ma wartość dla firmy. Działa stabilnie przez wiele lat. Niektóre programy zbudowane bez testów jednostkowych przetwarzają transakcje o wartości milionów dolarów dziennie. Jednak kod, który nie zawiera testów jednostkowych, z czasem zamienia się w wielką kulę brudu, ponieważ przez lata dotykało go wielu programistów zajmujących się konserwacją kodu. Refaktoryzacja umożliwia programistom stopniowe wprowadzanie zmian w systemie, aby umożliwić jego testowanie. Zmiany te wymagają jednak czasu. Kilka lat temu omawiałem z moim kolegą Bobem Reselmanem kwestię stosowania testów jednostkowych w starszych aplikacjach. Reselman argumentował, że wdrażanie testów jednostkowych w aplikacjach zbudowanych bez nich jest zbyt drogie, a nawet głupie. Zamiast tego zalecił organizacji rozpoczęcie nowego rozwoju od testów jednostkowych i pozostawienie starszych aplikacji w spokoju. Może to dotyczyć języka COBOL, generatorów raportów i innych aplikacji, ale twierdzę, że w aplikacjach napisanych we współczesnych językach — C++, C#, Java i Ruby — dość łatwo jest dodać testy jednostkowe z mocą wsteczną. Zamiast pisać je dla całej aplikacji, po prostu dodaj testy jednostkowe do bieżącej zmiany i refaktoryzuj w miarę upływu czasu.

Zwiększona szybkość, jakość i testowalność

Kierownicy projektów twierdzą, że planowanie wymaga kompromisów między jakością, ilością wykonanej pracy, zasobami i czasem. Aby dodać coś do jednego obszaru, trzeba zabrać coś z drugiego. Skuteczne testy jednostkowe łamią tę zasadę. Właśnie dlatego testy jednostkowe są ważne i cenne dla organizacji. Dobre testy jednostkowe dają testowalny kod, który poprawia jakość. Ten kod będzie miał mniej defektów, co oznacza mniej poprawek błędów, aby szybciej ukończyć projekt. Kiedy oprogramowanie napotyka błędy, testy jednostkowe przyspieszają debugowanie, naprawianie i pisanie kodu. A dzieje się to w taki sposób, że prawdopodobieństwo ponownego wystąpienia wady jest znacznie zmniejszone, przy jednoczesnej poprawie jakości i szybkości kodu. Chociaż w tworzeniu oprogramowania nie ma magicznego środka, skuteczne testy jednostkowe mogą przyspieszyć rozwój, testowanie, a nawet niektóre inżynierie wymagań funkcjonalnych.

5 sposobów kopiowania tablicy w Javie

Źródło: Dev.to Masz więc dwie tablice A i B i musisz skopiować elementy z A do B. Cóż, w Javie można to zrobić na różne sposoby i pokażę je teraz.

Metoda pierwsza: ForLoop

Tutaj z pomocą przychodzi nam stara, dobra pętla for :
int[] A = {1,2,4,4};
int[] B = new int[];

 for (int i = 0; i < A.length; i++){
      B[i] = A[i];
}

Metoda druga: .clone()

Metoda klonowania tablicowego może również pomóc w osiągnięciu pożądanego rezultatu:
int[] A = {1,2,4,4};
int[] B = A.clone();//the clone method copies the content of A into B;

Metoda trzecia: System.arraycopy()

Następnym sposobem jest użycie metody System.arraycopy() znajdującej się w pakiecie java.lang . Zanim przejdziemy do jego użycia, omówmy jego sygnaturę:
public static void arraycopy(
    Object src, //:source array, in this case A
    int srcPos, //:the start index for copy, typically 0
    Object dest, //:destination object in this case B.
    int destPos, //:the index to place the copied elements
    int length //:the length of the contents to be copied
);
Aplikacja:
int[] A = {1,2,4,4};
int[] B = new int[];

System.arraycopy(A, 0, B, 0, A.length);

Metoda czwarta: Arrays.copyOf()

Następną opcją kopiowania, którą omówimy, jest klasa Arrays z pakietu java.utils . Zwróć uwagę na jego podpis:
public static int[] copyOf(
    int[] original, // :source array in this case A
    int newLength // :the length of the contents to be copied
);
Aplikacja:
int[] A = {1,2,4,4};
int[] B = Arrays.copyOf(A, 3);

Metoda piąta: Arrays.copyOfRange()

Będzie to zatem ostatnia opcja, którą omówimy w tym poście. Pochodzi także z klasy Arrays znajdującej się w pakiecie java.utils . Spójrzmy jeszcze raz na jego podpis:
public static int[] copyOfRange​(
    int[] original, // :source array in this case A
    int from,  //:the start index for copy, typically 0
    int to // the end index exclusive
);
Aplikacja:
int[] A = {1,2,3,4,5,6,7};
int[] B = Arrays.copyOfRange(A, 0, A.length);
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION