JavaRush /Java блог /Random UA /Кава-брейк #87. Чому модульне тестування є важливим для р...

Кава-брейк #87. Чому модульне тестування є важливим для розробників? 5 способів скопіювати масив у Java

Стаття з групи Random UA

Чому модульне тестування є важливим для розробників?

Джерело: SearchSoftwareQuality Давайте обговоримо, чому модульне тестування є важливим і цінним, а також як воно полегшує процес налагодження. Модульне тестування – потужний інструмент для підвищення якості програмного забезпечення. Модульні тести забезпечують фундаментальну перевірку того, що програма відповідає специфікаціям програмного забезпечення і поводиться так, як задумано. Кава-брейк #87.  Чому модульне тестування є важливим для розробників?  5 способів скопіювати масив у Java - 1Коли все зроблено добре, модульні тести:
  • зменшують кількість дефектів та виявляють їх на ранніх етапах життєвого циклу розробки;
  • покращують читаність коду;
  • допускають повторне використання коду;
  • підвищують швидкість розгортання.
Давайте розберемося, чому модульне тестування є важливим, як виник цей тип тестування і які існують перешкоди на шляху його впровадження.

Історія модульного тестування

Помилка, виявлена ​​на ранній стадії, - це економія часу та зусиль. Протягом перших 50 років історії комп'ютерів модульне тестування та налагодження були по суті одним і тим самим. Але до 1990-х років код став настільки складним, що часто неможливо було розділити систему на дрібні частини для їх ізольованого запуску. У 1997 році програміст на ім'я Кент Бек створив JUnit - плагін середовища розробки для тестування невеликих фрагментів коду. Тестовий код, який оцінює вихідний код, назвали модульними тестами. Цей різновид модульного тестування став основним на довгі роки. Після того, як Бек створив JUnit, Мартін Фаулер написав книгу "Рефакторинг", в якій запропонував способи перетворення коду, щоб зробити його більш ізольованим та тестованим. Комбінація рефакторингу коду та модульного тестування призвела до розробки, заснована на тестуванні, де створення модульних тестів має важливе значення для процесу програмування. У ній код має бути тестованим ще до створення. Таким чином, програмування не завершується до запуску модульних тестів. Потім проект може стати стадії дослідження на системному чи людському рівні.

Приклад модульного тестування

Цей приклад показує важливість модульного тестування. Тут JUnit оцінює просту функцію, яка перетворює температуру з Фаренгейта на Цельсій. Формула перетворення: C = (F-32) * 5/9. Усього кілька рядків, включаючи сигнатуру функції та фігурні дужки, можна реалізувати у коді як бібліотечну функцію. Однак із функції не ясно, що це критерії. Ці параметри можуть включати округлення значень у більшу або меншу сторону, дійсні числа або верхній і нижній межі. Давайте створимо приклади модульних тестів для цієї функції перетворення температури на Perl, використовуючи модуль Test :: More. Перший рядок — це коментар, який повідомляє програмісту, чого чекати від коду, що залишився.
# 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');
Фреймворк JUnit спирається на об'єктно-орієнтовані системи та об'єкти тестування, але концепція аналогічна.

Ізольовані модульні випробування

Одна з переваг модульних тестів полягає в тому, що вони ізолюють функцію, клас або метод та тестують лише цей фрагмент коду. Більш якісні окремі компоненти забезпечують загальну стійкість до відмови системи. Таким чином виходить надійний код. Модульні випробування також змінюють характер процесу налагодження. Щоб спробувати виправити помилку, програмісти просто пишуть невдалий тест, а потім повторюють його, щоб він пройшов, не порушуючи попередні очікування. Цей процес виключає ручний цикл традиційного налагодження за допомогою налаштування, повторного створення, призупинення та перевірки. Для зміни коду, щоб зробити його придатним для модульного тестування, програмісти повинні змінити процес своєї роботи. Будь-які фрагменти коду, написані без модульних тестів, швидше за все, вважатимуться неперевіреними, принаймні,

Адаптація модульних тестів

Застаріле (Legacy) програмне забезпечення - це програма, яка працює протягом тривалого часу і, швидше за все, написана без модульних тестів. Legacy-код має цінність для компанії. Він стабільно працює довгі роки. Деякі програми, створені без використання модульних тестів, обробляють транзакції мільйон доларів на день. Але код, в якому немає модульних тестів, згодом перетворюється на велику грудку бруду, оскільки протягом багатьох років до нього торкалися багато програмістів, які займаються обслуговуванням коду. Рефакторинг дозволяє програмістам поступово вносити до системи зміни, щоб зробити її тестованою. Однак ці зміни потребують часу. Кілька років тому я обговорював зі своїм колегою Бобом Реселманом питання використання модульних тестів для застарілих додатків. Реселман стверджував, що впроваджувати модульне тестування до програм, створених без них, занадто дорого і навіть безглуздо. Натомість він рекомендував організації почати нову розробку з модульних тестів і залишити застарілі програми у спокої. Можливо, це вірно для COBOL, генераторів програм звітів та інших додатків, але я стверджую, що додатків, написаних сучасними мовами - C ++, C #, Java і Ruby - додавати модульні тести заднім числом досить просто. Замість того, щоб писати їх для всієї програми, просто додайте модульні тести до поточної зміни та виконуйте рефакторинг у міру просування. генераторів програм звітів та інших додатків, але я стверджую, що додатків, написаних сучасними мовами - C ++, C #, Java і Ruby - додавати модульні тести заднім числом досить просто. Замість того, щоб писати їх для всієї програми, просто додайте модульні тести до поточної зміни та виконуйте рефакторинг у міру просування. генераторів програм звітів та інших додатків, але я стверджую, що додатків, написаних сучасними мовами - C ++, C #, Java і Ruby - додавати модульні тести заднім числом досить просто. Замість того, щоб писати їх для всієї програми, просто додайте модульні тести до поточної зміни та виконуйте рефакторинг у міру просування.

Підвищення швидкості, якості та тестованості

Керівники проектів кажуть, що планування передбачає компроміс між якістю, обсягом виконаної роботи, ресурсами та часом. Щоб додати щось до однієї області, ви повинні відібрати щось від іншої. Ефективні модульні випробування порушують це правило. Ось чому модульне тестування є важливим і цінним для організацій. Хороші модульні тести створюють тестований код, який покращує якість. У цьому коді буде менше дефектів, а значить, менше виправлень помилок для швидшого завершення проекту. Коли у програмному забезпеченні виникають помилки, модульні тести прискорюють налагодження, виправлення та написання коду. І це відбувається таким чином, що ймовірність повторення дефекту значно знижується – одночасно покращується якість та швидкість коду. Хоча в розробці програмного забезпечення немає чарівної палички,

5 способів скопіювати масив у Java

Джерело: Dev.to Отже, у вас є два масиви A і B і вам потрібно скопіювати елементи з A до B. Що ж, є різні способи зробити це на Java, і зараз я вам їх покажу.

Метод перший: ForLoop

Тут нам на допомогу приходить старий-добрий цикл for :
int[] A = {1,2,4,4};
int[] B = new int[];

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

Метод другий: .clone()

Метод клонування масиву також може допомогти досягти бажаного результату:
int[] A = {1,2,4,4};
int[] B = A.clone();//the clone method copies the content of A into B;

Метод третій: System.arraycopy()

Наступний спосіб - використання методу System.arraycopy() , який є у пакеті java.lang . Перш ніж ми перейдемо до його застосування, обговоримо його підпис:
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
);
Застосування:
int[] A = {1,2,4,4};
int[] B = new int[];

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

Метод четвертий: Arrays.copyOf()

Наступний варіант копіювання, який ми обговоримо, стосується класу Arrays з пакету java.utils . Зверніть увагу на його підпис:
public static int[] copyOf(
    int[] original, // :source array in this case A
    int newLength // :the length of the contents to be copied
);
Застосування:
int[] A = {1,2,4,4};
int[] B = Arrays.copyOf(A, 3);

Метод п'ятий: Arrays.copyOfRange()

Отже, це буде останній варіант, на який ми звернемо увагу до цієї публікації. Він теж із класу Arrays , що є у пакеті java.utils . Ще раз подивимося його підпис:
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
);
Застосування:
int[] A = {1,2,3,4,5,6,7};
int[] B = Arrays.copyOfRange(A, 0, A.length);
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ