JavaRush /Java blogi /Random-UZ /Kofe tanaffusi №87. Nima uchun birlik testi ishlab chiquv...

Kofe tanaffusi №87. Nima uchun birlik testi ishlab chiquvchilar uchun muhim? Java-da massivdan nusxa olishning 5 ta usuli

Guruhda nashr etilgan

Nima uchun birlik testi ishlab chiquvchilar uchun muhim?

Manba: SearchSoftwareQuality . Keling, birlik testi nima uchun muhim va qimmatli ekanligini va u nosozliklarni tuzatishni qanday osonlashtirishini muhokama qilaylik. Birlik testi dasturiy ta'minot sifatini yaxshilash uchun kuchli vositadir. Birlik testlari dasturning dasturiy ta'minot spetsifikatsiyalariga muvofiqligini va mo'ljallangan tarzda harakat qilishini fundamental tekshirishni ta'minlaydi. Kofe tanaffusi №87.  Nima uchun birlik testi ishlab chiquvchilar uchun muhim?  Java-da massivdan nusxa olishning 5 ta usuli - 1Yaxshi bajarilganda, birlik sinovlari:
  • nuqsonlar sonini kamaytirish va ularni rivojlanish hayot tsiklining dastlabki bosqichlarida aniqlash;
  • kodni o'qishni yaxshilash;
  • kodni qayta ishlatishga ruxsat berish;
  • joylashtirish tezligini oshirish.
Keling, birlik testi nima uchun muhimligini, ushbu turdagi test qanday paydo bo'lganini va uni amalga oshirishdagi to'siqlarni ko'rib chiqaylik.

Birlik sinovlari tarixi

Dastlabki bosqichda aniqlangan xato vaqt va kuchni tejaydi. Kompyuter tarixining dastlabki 50 yilida birlik sinovi va disk raskadrovka bir xil narsa edi. Ammo 1990-yillarga kelib, kod shu qadar murakkab bo'lib qoldiki, tizimni alohida-alohida ishlatish uchun ko'pincha kichik qismlarga bo'lish imkonsiz edi. 1997 yilda Kent Bek ismli dasturchi kichik kod qismlarini sinab ko'rish uchun JUnit ishlab chiqish muhiti plaginini yaratdi. Manba kodini baholovchi test kodi birlik testlari deb ataladi. Ushbu turdagi birlik sinovi ko'p yillar davomida asosiy narsaga aylandi. Bek JUnit-ni yaratgandan so'ng, Martin Fauler "Refaktoring" kitobini yozdi va unda kodni yanada xavfsizroq va sinovdan o'tkazish uchun o'zgartirish usullarini taklif qildi. Kodni qayta tiklash va birlik testining kombinatsiyasi testga asoslangan rivojlanishga olib keldi, bu erda birlik testlarini yaratish dasturlash jarayoni uchun muhim ahamiyatga ega. Unda kod yaratilishidan oldin ham sinovdan o'tishi kerak. Shunday qilib, birlik testlari bajarilmaguncha dasturlash jarayoni tugallanmaydi. Keyin loyiha tizim darajasida yoki inson darajasida tadqiqot bosqichiga o'tishi mumkin.

Birlik sinoviga misol

Ushbu misol birlik sinovining muhimligini ko'rsatadi. Bu erda JUnit haroratni Farengeytdan Selsiyga aylantiradigan oddiy funktsiyani baholaydi. O'tkazish formulasi: C = (F-32) * 5/9. Funktsiya imzosi va jingalak qavslarni o'z ichiga olgan bir nechta satrlar kutubxona funktsiyasi sifatida kodda amalga oshirilishi mumkin. Biroq, funktsiyadan bu mezonlar ekanligi aniq emas. Ushbu variantlar yuqoriga yoki pastga yaxlitlash, haqiqiy raqamlar yoki yuqori va pastki chegaralarni o'z ichiga olishi mumkin. Test::More moduli yordamida Perlda haroratni o'zgartirish funksiyasi uchun namuna birlik testlarini yarataylik. Birinchi qator dasturchiga qolgan koddan nimani kutish kerakligini aytadigan izohdir.
# 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 ramkasi ob'ektga yo'naltirilgan tizimlar va test ob'ektlariga tayanadi, ammo tushunchasi o'xshash.

Izolyatsiya qilingan birlik sinovlari

Birlik testlarining afzalliklaridan biri shundaki, ular funktsiya, sinf yoki usulni ajratib turadi va faqat shu kod qismini sinab ko'radi. Yaxshiroq individual komponentlar tizimning umumiy chidamliligini ta'minlaydi. Shunday qilib, siz ishonchli kodni olasiz. Birlik testlari disk raskadrovka jarayonining xarakterini ham o'zgartiradi. Xatoni tuzatishga urinib ko'rish uchun dasturchilar shunchaki muvaffaqiyatsiz test yozadilar va keyin uni avvalgi taxminlarni buzmasdan o'tishi uchun takrorlaydilar. Bu jarayon sozlash, qayta yaratish, pauza qilish va sinovdan o'tkazish orqali an'anaviy disk raskadrovkaning qo'lda aylanishini yo'q qiladi. Kodni birlik testi uchun mos qilish uchun o'zgartirish uchun dasturchilar ishlash usullarini o'zgartirishlari kerak. Birlik testlarisiz yozilgan har qanday kod bo'laklari hech bo'lmaganda alohida modullar sifatida tekshirilmagan deb hisoblanadi.

Birlik testlarini moslashtirish

Eski dasturiy ta'minot uzoq vaqt davomida ishlayotgan va birlik sinovlarisiz yozilgan dasturiy ta'minotdir. Eski kod kompaniya uchun muhim ahamiyatga ega. Ko'p yillar davomida barqaror ishlaydi. Birlik sinovlarisiz yaratilgan ba'zi dasturlar kuniga million dollarlik tranzaktsiyalarni qayta ishlaydi. Ammo birlik sinovlari bo'lmagan kod vaqt o'tishi bilan katta axloqsizlik to'piga aylanadi, chunki yillar davomida ko'plab kodlarga texnik xizmat ko'rsatuvchi dasturchilar unga tegishgan. Refaktoring dasturchilarga tizimni sinovdan o'tkazish uchun bosqichma-bosqich o'zgartirishlar kiritish imkonini beradi. Biroq, bu o'zgarishlar vaqt talab etadi. Bir necha yil oldin men hamkasbim Bob Reselman bilan eski ilovalar uchun birlik testlaridan foydalanish masalasini muhokama qildim. Reselmanning ta'kidlashicha, ularsiz qurilgan ilovalarda birlik testini amalga oshirish juda qimmat va hatto ahmoqdir. Buning o'rniga, u tashkilotga yangi ishlanmalarni birlik testlari bilan boshlashni va eski ilovalarni yolg'iz qoldirishni tavsiya qildi. Bu COBOL, hisobot generatorlari va boshqa ilovalar uchun to'g'ri bo'lishi mumkin, ammo men zamonaviy tillarda - C++, C#, Java va Ruby-da yozilgan ilovalarda birlik testlarini orqaga qaytarish juda oson ekanligini ta'kidlayman. Ularni butun dastur uchun yozish o'rniga, joriy o'zgarish va qayta ishlashga birlik testlarini qo'shing.

Tezlik, sifat va sinovdan o'tish qobiliyati ortdi

Loyiha menejerlarining ta'kidlashicha, rejalashtirish sifat, bajarilgan ish miqdori, resurslar va vaqt o'rtasidagi muvozanatni o'z ichiga oladi. Bir hududga biror narsa qo'shish uchun siz boshqasidan biror narsani olib qo'yishingiz kerak. Samarali birlik testlari bu qoidani buzadi. Shuning uchun birlik testi tashkilotlar uchun muhim va qimmatlidir. Yaxshi birlik testlari sifatni yaxshilaydigan sinovdan o'tkaziladigan kodni ishlab chiqaradi. Ushbu kodda kamroq nuqsonlar bo'ladi, ya'ni loyihani tezroq yakunlash uchun kamroq xatolar tuzatiladi. Dasturiy ta'minot xatolarga duch kelganda, birlik testlari disk raskadrovka, tuzatish va kod yozishni tezlashtiradi. Va bu shunday sodir bo'ladiki, bir vaqtning o'zida kod sifati va tezligini yaxshilash bilan birga, nuqsonning takrorlanish ehtimoli sezilarli darajada kamayadi. Dasturiy ta'minotni ishlab chiqishda sehrli o'q bo'lmasa-da, samarali birlik testlari ishlab chiqish, sinovdan o'tkazish va hatto ba'zi funktsional talablar muhandisligini tezlashtirishi mumkin.

Java-da massivdan nusxa olishning 5 ta usuli

Manba: Dev.to Demak, sizda ikkita A va B massiv bor va siz elementlarni A dan B ga nusxalashingiz kerak. Xo'sh, Javada buni qilishning turli usullari mavjud va men ularni hozir ko'rsataman.

Birinchi usul: ForLoop

Bu erda eski for loop yordamga keladi :
int[] A = {1,2,4,4};
int[] B = new int[];

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

Ikkinchi usul: .clone()

Massivni klonlash usuli ham kerakli natijaga erishishga yordam beradi:
int[] A = {1,2,4,4};
int[] B = A.clone();//the clone method copies the content of A into B;

Uchinchi usul: System.arraycopy()

Keyingi usul Java.lang paketida joylashgan System.arraycopy() usulidan foydalanishdir . Uni ishlatishga o'tishdan oldin uning imzosini muhokama qilaylik:
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
);
Ilova:
int[] A = {1,2,4,4};
int[] B = new int[];

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

To'rtinchi usul: Arrays.copyOf()

Biz muhokama qiladigan keyingi nusxalash varianti java.utils paketidagi Arrays sinfidir . Uning imzosiga e'tibor bering:
public static int[] copyOf(
    int[] original, // :source array in this case A
    int newLength // :the length of the contents to be copied
);
Ilova:
int[] A = {1,2,4,4};
int[] B = Arrays.copyOf(A, 3);

Beshinchi usul: Arrays.copyOfRange()

Shunday qilib, bu biz ushbu maqolada ko'rib chiqadigan oxirgi variant bo'ladi. Bu java.utils paketida mavjud bo'lgan Arrays sinfidan hamdir . Keling, uning imzosiga yana qaraylik:
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
);
Ilova:
int[] A = {1,2,3,4,5,6,7};
int[] B = Arrays.copyOfRange(A, 0, A.length);
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION