Биёед бубинем, ки чаро санҷиши воҳид муҳим аст, ин навъи санҷиш чӣ гуна ба вуҷуд омадааст ва монеаҳо барои татбиқи он чӣ гунаанд.
Таърихи санҷиши воҳидҳо
Хатогие, ки дар марҳилаи аввал ошкор шудааст, вақт ва кӯшишро сарфа мекунад. Дар тӯли 50 соли аввали таърихи компютер, санҷиши воҳидҳо ва ислоҳи хатогӣ аслан як чиз буданд. Аммо дар солҳои 1990-ум, code чунон мураккаб гашт, ки аксар вақт тақсим кардани система ба қисмҳои хурд имконнопазир буд, то онҳо дар алоҳидагӣ кор кунанд. Дар соли 1997, барномасоз бо номи Кент Бек JUnit, плагини муҳити рушдро барои санҷиши қисмҳои хурди code сохт. Рамзи санҷиш, ки рамзи сарчашмаро арзёбӣ мекунад, санҷишҳои воҳид номида мешаванд. Ин навъи санҷиши воҳидҳо дар тӯли солҳои зиёд ба як чизи асосӣ табдил ёфтааст. Пас аз он ки Бек JUnit-ро таъсис дод, Мартин Фаулер китоби «Рефакторинг»-ро навишт, ки дар он ӯ роҳҳои табдил додани codeро пешниҳод кард, то он бештар ҷудошуда ва санҷида шавад. Маҷмӯи рефакторинги code ва санҷиши воҳидҳо ба рушди ба санҷиш асосёфта оварда расонд, ки дар он эҷоди санҷишҳои воҳидҳо барои раванди барномасозӣ муҳим аст. Дар он, code бояд ҳатто пеш аз сохтани он санҷида шавад. Ҳамин тариқ, раванди барномасозӣ то он даме, ки санҷишҳои воҳид иҷро карда шаванд, анҷом дода намешавад. Пас аз он лоиҳа метавонад ба марҳилаи тадқиқоти сатҳи система ё сатҳи инсонӣ гузарад.
Намунаи санҷиши воҳид
Ин мисол аҳамияти санҷиши воҳидро нишон медиҳад. Дар ин ҷо JUnit функсияи оддиеро арзёбӣ мекунад, ки ҳароратро аз Фаренгейт ба Цельсий табдил медиҳад. Формулаи табдил: C = (F-32) * 5/9. Танҳо чанд сатр, аз ҷумла имзои функсия ва қавсҳои ҷингила, метавонанд дар code ҳамчун вазифаи китобхона амалӣ карда шаванд. Аммо, аз функсия маълум нест, ки ин меъёрҳо мебошанд. Ин интихобҳо метавонанд яклухткунии боло ё поён, рақамҳои воқеӣ ё ҳудуди боло ва поёниро дар бар гиранд. Биёед бо истифода аз модули Test:: More санҷишҳои воҳиди намунавӣ барои ин функсияи табдor ҳароратро дар Perl эҷод кунем. Сатри аввал шарҳест, ки ба барномасоз мегӯяд, ки аз рамзи боқимонда чиро интизор аст.
# 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 ба системаҳои ба an object нигаронидашуда ва an objectҳои санҷишӣ такя мекунад, аммо консепсия шабеҳ аст.
Санҷишҳои воҳиди ҷудошуда
Яке аз бартариҳои санҷишҳои воҳидҳо дар он аст, ки онҳо функсия, синф ё усулро ҷудо мекунанд ва танҳо он порчаи codeро месанҷанд. Ҷузъҳои беҳтари инфиродӣ устувории умумии системаро таъмин мекунанд. Бо ин роҳ шумо рамзи боэътимод мегиред. Санҷишҳои воҳидҳо инчунин хусусияти раванди ислоҳро тағир медиҳанд. Барои ислоҳи хатогиҳо, барномасозон танҳо як санҷиши ноком менависанд ва сипас онро такрор мекунанд, то он бе вайрон кардани интизориҳои қаблӣ мегузарад. Ин раванд сикли дастии ислоҳи анъанавиро тавассути насб, дубора эҷод, таваққуф ва озмоиш нест мекунад. Барои тағир додани code барои мувофиқ кардани он барои санҷиши воҳид, барномасозон бояд тарзи кори худро тағир диҳанд. Ҳама порчаҳои codeе, ки бидуни санҷишҳои воҳид навишта шудаанд, эҳтимолан ҳадди аққал ҳамчун модулҳои инфиродӣ санҷидашуда ҳисобида мешаванд.
Санҷишҳои мутобиқсозӣ
Нармафзори кӯҳна нармафзорест, ки муддати тӯлонӣ кор мекунад ва эҳтимолан бидуни санҷиши воҳидҳо навишта шудааст. Рамзи меросӣ барои ширкат арзиш дорад. Он солхои зиёд муътадил кор мекунад. Баъзе барномаҳое, ки бидуни санҷиши воҳид сохта шудаанд, дар як рӯз транзаксияҳои миллион долларро коркард мекунанд. Аммо codeе, ки санҷишҳои воҳидиро надорад, бо мурури замон ба як тӯби бузурги лой табдил меёбад, зеро дар тӯли солҳо ба он бисёр барномасозони нигоҳубини code даст задаанд. Рефакторинг ба барномасозон имкон медиҳад, ки тадриҷан ба система тағирот ворид кунанд, то онро санҷида тавонанд. Аммо, ин тағиротҳо вақтро талаб мекунанд. Чанд сол пеш, ман бо ҳамтои худ Боб Реселман масъалаи истифодаи санҷишҳои воҳидҳоро барои барномаҳои кӯҳна муҳокима кардам. Реселман изҳор дошт, ки татбиқи санҷиши воҳидҳо дар замимаҳои бе он сохташуда хеле гарон ва ҳатто аблаҳ аст. Ба ҷои ин, вай ба созмон тавсия дод, ки таҳияи навро бо санҷишҳои воҳид оғоз кунад ва барномаҳои кӯҳнаро танҳо гузорад. Ин метавонад барои COBOL, генераторҳои гузоришҳо ва дигар замимаҳо дуруст бошад, аммо ман баҳс мекардам, ки дар замимаҳои бо забонҳои муосир навишташуда - C++, C#, Java ва Ruby - илова кардани санҷишҳои воҳиди бозгашт хеле осон аст. Ба ҷои навиштани онҳо барои тамоми барнома, танҳо санҷишҳои воҳидиро ба тағироти ҷорӣ ва рефактор ҳангоми рафтан илова кунед.
Сарчашма: Dev.to Ҳамин тавр, шумо ду массиви A ва B доред ва шумо бояд элементҳоро аз A то B нусхабардорӣ кунед. Хуб, роҳҳои гуногуни иҷрои ин кор дар Java вуҷуд доранд ва ман онҳоро ҳоло ба шумо нишон медиҳам.
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 ҷойгир аст . Пеш аз он ки мо ба истифодаи он гузарем, биёед имзои онро муҳокима кунем:
publicstaticvoidarraycopy(Object src,//:source array, in this case Aint srcPos,//:the start index for copy, typically 0Object dest,//:destination object in this case B.int destPos,//:the index to place the copied elementsint length //:the length of the contents to be copied);
publicstaticint[]copyOf(int[] original,// :source array in this case Aint 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 мавҷуд аст . Биёед бори дигар ба имзои ӯ назар андозем:
publicstaticint[] copyOfRange(int[] original,// :source array in this case Aint from,//:the start index for copy, typically 0intto// the end index exclusive);
GO TO FULL VERSION