JavaRush /Java Blogu /Random-AZ /Kofe fasiləsi №87. Nə üçün vahid testi tərtibatçılar üçün...

Kofe fasiləsi №87. Nə üçün vahid testi tərtibatçılar üçün vacibdir? Java-da massivi kopyalamağın 5 yolu

Qrupda dərc edilmişdir

Nə üçün vahid testi tərtibatçılar üçün vacibdir?

Mənbə: SearchSoftwareQuality Gəlin vahid testinin nə üçün vacib və dəyərli olduğunu və onun sazlamağı necə asanlaşdırdığını müzakirə edək. Vahid testi proqram təminatının keyfiyyətini yaxşılaşdırmaq üçün güclü vasitədir. Vahid testləri tətbiqin proqram təminatının spesifikasiyasına uyğunluğunun və nəzərdə tutulduğu kimi davranmasının əsas yoxlanışını təmin edir. Kofe fasiləsi №87.  Nə üçün vahid testi tərtibatçılar üçün vacibdir?  Java-da massivi kopyalamağın 5 yolu - 1Yaxşı edildikdə, vahid testləri:
  • qüsurların sayını azaltmaq və inkişafın həyat dövrünün erkən mərhələlərində onları müəyyən etmək;
  • kodun oxunuşunu yaxşılaşdırmaq;
  • kodun təkrar istifadəsinə icazə verin;
  • yerləşdirmə sürətini artırın.
Gəlin vahid testin niyə vacib olduğuna, bu növ testin necə yarandığına və onun həyata keçirilməsinə maneələrin nə olduğuna baxaq.

Vahid Testinin Tarixi

Erkən mərhələdə aşkar edilən səhv vaxta və səyə qənaət edir. Kompüter tarixinin ilk 50 ilində vahidlərin yoxlanılması və sazlanması mahiyyətcə eyni şey idi. Lakin 1990-cı illərə qədər kod o qədər mürəkkəbləşdi ki, sistemi ayrı-ayrılıqda idarə etmək üçün kiçik hissələrə bölmək çox vaxt mümkün deyildi. 1997-ci ildə Kent Beck adlı proqramçı kiçik kod hissələrini sınamaq üçün inkişaf mühiti plaginini JUnit yaratdı. Mənbə kodunu qiymətləndirən test kodu vahid testlər adlanır. Bu tip vahid testi uzun illərdir ki, bir ştapel halına gəlir. Bek JUnit-i yaratdıqdan sonra Martin Fowler "Refaktorinq" kitabını yazdı və bu kitabda kodu daha təcrid olunmuş və sınaqdan keçirilə bilən hala gətirmək üçün çevrilmə yollarını təklif etdi. Kodun refaktorinqi və vahid testinin birləşməsi test əsaslı inkişafa gətirib çıxardı, burada vahid testlərinin yaradılması proqramlaşdırma prosesi üçün vacibdir. Orada kod yaradılmazdan əvvəl sınaqdan keçirilməlidir. Beləliklə, vahid testləri işə salınana qədər proqramlaşdırma prosesi tamamlanmır. Layihə daha sonra sistem səviyyəsində və ya insan səviyyəsində tədqiqat mərhələsinə keçə bilər.

Vahid sınaq nümunəsi

Bu nümunə vahid testinin vacibliyini nümayiş etdirir. Burada JUnit temperaturu Fahrenheitdən Selsiyə çevirən sadə funksiyanı qiymətləndirir. Dönüşüm düsturu: C = (F-32) * 5/9. Funksiya imzası və əyri mötərizələr daxil olmaqla sadəcə bir neçə sətir kitabxana funksiyası kimi kodda həyata keçirilə bilər. Lakin funksiyadan bunların meyar olduğu aydın deyil. Bu seçimlərə yuxarı və ya aşağı yuvarlaqlaşdırma, real ədədlər və ya yuxarı və aşağı hədlər daxil ola bilər. Test::More modulundan istifadə edərək Perl-də bu temperaturun çevrilməsi funksiyası üçün nümunə vahid testləri yaradaq. Birinci sətir proqramçıya qalan koddan nə gözlədiyini bildirən şərhdir.
# 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 çərçivəsi obyekt yönümlü sistemlərə və sınaq obyektlərinə əsaslanır, lakin konsepsiya oxşardır.

İzolyasiya edilmiş vahid testləri

Vahid testlərinin üstünlüklərindən biri funksiyanı, sinfi və ya metodu təcrid etmək və yalnız həmin kod parçasını sınaqdan keçirməkdir. Daha yaxşı fərdi komponentlər sistemin ümumi dayanıqlığını təmin edir. Bu yolla etibarlı kod əldə edirsiniz. Vahid testləri həmçinin sazlama prosesinin xarakterini dəyişir. Bir səhvi düzəltməyə çalışmaq üçün proqramçılar sadəcə uğursuz bir test yazır və sonra onu təkrarlayırlar ki, əvvəlki gözləntiləri pozmadan keçsin. Bu proses quraşdırma, yenidən yaratmaq, fasilə və sınaq vasitəsilə ənənəvi sazlamanın əl dövrəsini aradan qaldırır. Kodu bölmənin sınağı üçün uyğunlaşdırmaq üçün dəyişdirmək üçün proqramçılar iş üsullarını dəyişdirməlidirlər. Vahid testləri olmadan yazılmış hər hansı kod parçası, ən azı fərdi modullar kimi sınaqdan keçirilməmiş hesab ediləcək.

Uyğunlaşma Vahid Testləri

Köhnə proqram təminatı uzun müddətdir işləyən və çox güman ki, vahid testləri olmadan yazılmış proqramdır. Köhnə kodun şirkət üçün dəyəri var. Uzun illər stabil işləyir. Vahid testləri olmadan qurulan bəzi proqramlar gündə milyon dollarlıq əməliyyatları emal edir. Lakin vahid testləri olmayan kod, illər ərzində bir çox kod baxım proqramçıları tərəfindən toxunduğu üçün zamanla böyük bir kir topuna çevrilir. Refaktorinq proqramçılara onu sınaqdan keçirmək üçün sistemdə tədricən dəyişikliklər etməyə imkan verir. Ancaq bu dəyişikliklər vaxt tələb edir. Bir neçə il əvvəl mən həmkarım Bob Reselman ilə köhnə tətbiqlər üçün vahid testlərindən istifadə məsələsini müzakirə etdim. Reselman, onsuz qurulmuş tətbiqlərdə vahid testinin həyata keçirilməsinin çox bahalı və hətta axmaq olduğunu müdafiə etdi. Bunun əvəzinə o, təşkilata vahid testləri ilə yeni inkişafa başlamağı və köhnə tətbiqləri tək buraxmağı tövsiyə etdi. Bu COBOL, hesabat generatorları və digər proqramlar üçün doğru ola bilər, lakin mən iddia edərdim ki, müasir dillərdə yazılmış proqramlarda - C++, C#, Java və Ruby - geriyə aktiv olaraq vahid testləri əlavə etmək olduqca asandır. Onları bütün tətbiq üçün yazmaq əvəzinə, sadəcə olaraq cari dəyişikliyə və refaktora vahid testləri əlavə edin.

Artan sürət, keyfiyyət və sınaqdan keçmə qabiliyyəti

Layihə menecerləri deyirlər ki, planlaşdırma keyfiyyət, tamamlanan işin miqdarı, resurslar və vaxt arasında mübadilələri nəzərdə tutur. Bir sahəyə bir şey əlavə etmək üçün digərindən nəyisə götürməlisiniz. Effektiv vahid testləri bu qaydanı pozur. Buna görə də vahid testi təşkilatlar üçün vacib və dəyərlidir. Yaxşı vahid testləri keyfiyyəti yaxşılaşdıran test edilə bilən kod istehsal edir. Bu kodun daha az qüsurları olacaq, bu da layihəni daha sürətli başa çatdırmaq üçün daha az səhv düzəlişləri deməkdir. Proqram təminatı səhvlərlə qarşılaşdıqda, vahid testləri sazlama, düzəltmə və kod yazmağı sürətləndirir. Və bu elə bir şəkildə baş verir ki, kodun keyfiyyəti və sürəti eyni vaxtda yaxşılaşdırılarkən qüsurun təkrar baş vermə ehtimalı əhəmiyyətli dərəcədə azalır. Proqram təminatının hazırlanmasında sehrli güllə olmasa da, effektiv vahid testləri inkişafı, sınaqları və hətta bəzi funksional tələblər mühəndisliyini sürətləndirə bilər.

Java-da massivi kopyalamağın 5 yolu

Mənbə: Dev.to Beləliklə, sizdə iki A və B massiv var və elementləri A-dan B-yə köçürməlisiniz. Yaxşı, Java-da bunu etməyin müxtəlif yolları var və mən onları indi sizə göstərəcəyəm.

Birinci üsul: ForLoop

Köhnə for loopun köməyimizə gəldiyi yer budur :
int[] A = {1,2,4,4};
int[] B = new int[];

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

İkinci üsul: .clone()

Massiv klonlama metodu da istədiyiniz nəticəni əldə etməyə kömək edə bilər:
int[] A = {1,2,4,4};
int[] B = A.clone();//the clone method copies the content of A into B;

Üçüncü üsul: System.arraycopy()

Növbəti yol java.lang paketində olan System.arraycopy() metodundan istifadə etməkdir . İstifadəsinə keçməzdən əvvəl onun imzasını müzakirə edək:
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
);
Ərizə:
int[] A = {1,2,4,4};
int[] B = new int[];

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

Dördüncü üsul: Arrays.copyOf()

Müzakirə edəcəyimiz növbəti nüsxə seçimi java.utils paketindən Arrays sinfidir . Onun imzasına diqqət yetirin:
public static int[] copyOf(
    int[] original, // :source array in this case A
    int newLength // :the length of the contents to be copied
);
Ərizə:
int[] A = {1,2,4,4};
int[] B = Arrays.copyOf(A, 3);

Beşinci üsul: Arrays.copyOfRange()

Beləliklə, bu, bu yazıda baxacağımız son seçim olacaq. O, həmçinin java.utils paketində mövcud olan Arrays sinfindəndir . Onun imzasına bir daha baxaq:
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
);
Ərizə:
int[] A = {1,2,3,4,5,6,7};
int[] B = Arrays.copyOfRange(A, 0, A.length);
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION