JavaRush /Java Blog /Random-TL /JUnit para sa JavaRush o kaunti tungkol sa pagsubok sa ba...
Sdu
Antas

JUnit para sa JavaRush o kaunti tungkol sa pagsubok sa bahay.

Nai-publish sa grupo
Pagod na sa pag-type ng data ng pagsubok sa console ng dose-dosenang beses upang suriin ang iyong gawain? Maligayang pagdating sa pusa, sasabihin ko sa iyo kung ano ang maaari mong gawin dito. Ang pinakalayunin ng materyal na ito ay ang i-automate ang paglulunsad ng gawaing niresolba gamit ang iba't ibang mga parameter at suriin ang mga resulta nang hindi gumagawa ng mga pagbabago sa source code nito. Tulad ng malamang na naunawaan mo na mula sa pamagat, ang aming pangunahing katulong sa medyo simpleng bagay na ito ay si JUnit . Kung hindi mo pa naririnig ang tungkol sa unit testing at unit test , iminumungkahi kong magpahinga ka ng kaunti at maging pamilyar sa mga konseptong ito, sa kabutihang palad mayroong sapat na impormasyon sa Internet. Hindi, ayaw mo? Well, okay, sa tingin ko hindi ito magiging isang malaking problema para sa pag-unawa sa kung ano ang nangyayari. Pagkatapos ng lahat, alam mo kung ano ang isang pagsubok at pagsubok sa pangkalahatan? Ginagawa mo ito sa tuwing ilulunsad mo ang iyong gawain, ilagay ang paunang data at ihambing ang resultang resulta sa inaasahan mong makita.
Hello, world JUnit!
Ano ang JUnit? Sa opisyal na website ng proyekto mababasa natin ang sumusunod na paglalarawan:
Ang JUnit ay isang simpleng balangkas upang magsulat ng mga paulit-ulit na pagsubok. Ito ay isang halimbawa ng xUnit architecture para sa unit testing frameworks.
Para sa amin, nangangahulugan ito ng kakayahang magsulat ng mga espesyal na idinisenyong klase na ang mga pamamaraan ay makikipag-ugnayan sa aming programa, ihambing ang resultang resulta sa sanggunian at ipaalam sa amin kung hindi sila tumugma. Upang maunawaan ang prinsipyo, isaalang-alang ang isang simpleng halimbawa. Ipagpalagay na mayroon tayong auxiliary class, na ang isa sa mga pamamaraan ay kumukuha ng dalawang variable ng uri int at ibinabalik ang kanilang kabuuan: JUnit para sa JavaRush o kaunti tungkol sa pagsubok sa bahay.  - 1 Ito ang functionality na susubukan nating subukan. Sa kabutihang palad, ang aming paboritong IDEA ay mayroon na ng lahat ng kailangan mo upang mabilis na makagawa ng mga pagsubok, ang kailangan lang namin ay ilagay ang cursor sa linya ng deklarasyon ng klase, pindutin ang "Alt + Enter" at piliin ang "Gumawa ng Pagsubok" sa menu ng konteksto: JUnit para sa JavaRush o kaunti tungkol sa pagsubok sa bahay.  - 2 Pagkatapos mong tukuyin kung saan dapat kang lumikha ng isang pagsubok, iminumungkahi ng IDEA ang pagpili ng isang library ng pagsubok (sa materyal na ito ay gumagamit ako ng JUnit4; upang ang mga klase sa library ay konektado sa proyekto, kailangan mong i-click ang pindutang "Ayusin"), mga pamamaraan na susuriin at karagdagang mga pagpipilian. JUnit para sa JavaRush o kaunti tungkol sa pagsubok sa bahay.  - 3 Gagawa ang IDE ng template ng test class: ClassName = TestClassName + "Test" MethodName = "test" + TestMethodName JUnit para sa JavaRush o kaunti tungkol sa pagsubok sa bahay.  - 4 Kailangan lang nating punan ang method body. Ang tinatawag na "Assertions" , mga pamamaraan na ibinigay ng JUnit , ay makakatulong dito . Sa pinasimpleng paraan, ganito ang hitsura ng kanilang trabaho: ang inaasahang resulta at ang resulta ng pagtawag sa pamamaraang sinusubok ay ipinapasa sa .assert* na paraan; para sa kaginhawahan, maaari kang magdagdag ng paliwanag na mensahe bilang unang parameter. Kung ang mga parameter ay hindi tumutugma sa panahon ng pagsubok, ipaalam sa iyo ang tungkol dito. Maaari kang maglunsad ng isang klase ng pagsubok para sa pagpapatupad tulad ng isang regular na klase, mas gusto kong gamitin ang key na kumbinasyon Ctrl+Shift+F10 JUnit para sa JavaRush o kaunti tungkol sa pagsubok sa bahay.  - 5
Tukuyin natin ang gawain
Sa teorya, ang lahat ay simple at maganda, ngunit sa konteksto ng iminungkahing halimbawa, hindi talaga kailangan; maaari tayong magtiwala sa computer na magdagdag ng dalawang numero. Mas interesado kami sa kung ano ang mangyayari sa mga tunay na problema na nalutas ng mga mag-aaral ng JavaRush, halimbawa, iminumungkahi kong kunin ang pinakamamahal na level05.lesson12.bonus03.
/* Problema sa mga algorithm Sumulat ng isang programa na: 1. ipinapasok ang numero N > 0 mula sa console 2. pagkatapos ay ipinapasok ang N mga numero mula sa console 3. ipinapakita ang maximum ng ipinasok na N numero. */
Kailangan nating magsulat ng tatlong pagsubok, para sa positibo, negatibong mga numero at isang halo-halong set.
Ang mas malayo sa kagubatan ...
Dito naghihintay sa amin ang ilang mga sorpresa: public class UtilApp { public static void main(String[] args) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); //напишите здесь ваш code int n; int maximum; /* Конечно же я не буду размещать решение задачи ;) Код приведенный тут переработан для наглядности, и не в коем случае не означает что он должен присутствовать в "правильном решении" */ System.out.println(maximum); } }
  • Ang logic ng programa ay inilalagay sa pangunahing() na pamamaraan
  • Ang source data ay hindi ipinapasa sa pamamaraan, ngunit ipinasok mula sa keyboard.
  • Ang pangunahing() na pamamaraan ay hindi nagbabalik ng resulta, ngunit inilalabas ito sa console.
Kung ang unang punto ay hindi partikular na may problema (maaari nating tawagan ang pangunahing() na pamamaraan tulad ng dati), kung gayon ang susunod na dalawa ay pumipilit sa amin na pumunta nang mas malalim sa paksa at pilitin ang aming mga utak. Nakakita ako ng ilang solusyon sa problema:
  1. Ang paglipat ng lohika para sa paghahanap ng maximum sa isang hiwalay na paraan.
    • Mga Pros: Tamang diskarte sa mga tuntunin ng refactoring
    • Kahinaan: Ang programa ay nagiging overgrown na may code, hindi kinakailangang mga istraktura, hindi bababa sa isang array o ArrayList ay idinagdag (depende sa lasa at kulay...). Tanging ang mekanismo para sa paghahanap ng maximum ay nasubok; ang input at output ng data ay hindi sinusuri.
  2. Pagsusulat ng mga wrapper para sa System.in/System.out.
    • Mga Pros: Hindi kami gumagamit ng mga third-party na library.
    • Cons: Ang landas ay hindi para sa mga nagsisimula. Ang relatibong kumplikado ng pagpapatupad ng pagsubok; ang dami ng code sa pagsubok ay maaaring mas malaki kaysa sa gawaing sinusuri.
  3. Paggamit ng karagdagang mga aklatan para sa mga pagsubok.
    • Mga Kalamangan: Malinis na code sa mga pagsusulit, medyo madali sa pagsulat ng pagsusulit. Ang source code ng klase sa ilalim ng pagsubok ay hindi nabago.
    • Cons: Kailangang ikonekta ang mga third-party na aklatan sa proyekto.
Sa totoo lang, pinakagusto ko ang pangatlong opsyon, kaya subukan nating ipatupad ito.
Mga Panuntunan ng System
Isang maikling paghahanap ang nagdala sa akin sa pahinang http://stefanbirkner.github.io/system-rules/ , at agad na naging malinaw na ito ang kailangan ko.
Isang koleksyon ng mga panuntunan ng JUnit para sa pagsubok ng code na gumagamit ng java.lang.System.
Kaya, i-download natin ang library . I-download ang library ng Commons IO na kinakailangan para gumana ang mga patakaran ng system . Ikinonekta namin ang parehong mga aklatan sa aming proyekto (File -> Structure ng Proyekto -> Mga Aklatan -> + -> Java) at simulan ang pag-sculpting: Pagkatapos ng paglunsad, hinihiling sa iyo ng aming gawain na magpasok ng mga N+1 na numero mula sa console, kung saan sasabihin sa iyo ng unang numero. ilang numero ang susunod sa kanya. Sa System Rules, ang TextFromStandardInputStream class ay ginagamit para sa mga layuning ito. Sa una, kailangan naming magdagdag ng field ng ganitong uri sa aming test class at markahan ito ng @Rule annotation: @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); Pagkatapos, direkta sa paraan ng pagsubok, ipinapahiwatig namin ang kinakailangang data: systemInMock.provideText("4\n2\n6\n1\n3\n"); Tulad ng nakikita mo, ang mga numero ay ipinapadala sa anyo ng teksto at pinaghihiwalay ng isang gitling na mga string na "\n". Batay dito, lumalabas na ang N ay magiging katumbas ng 4, at hahanapin natin ang maximum mula sa mga numerong {2, 6, 1, 3}. Susunod, kailangan nating lumikha ng isang halimbawa ng klase sa ilalim ng pagsubok at tawagan ang pangunahing() na pamamaraan. Binabasa ng aming programa ang data mula sa systemInMock, pinoproseso ito at ini-print ang resulta, at ang kailangan lang nating gawin ay basahin ito at ihambing ito sa pamantayan. Para magawa ito, ang mga panuntunan ng system ay nagbibigay sa amin ng klase ng StandardOutputStreamLog. Nagdagdag kami ng field ng tinukoy na uri: @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); Maaari mong basahin ang naka-print na data gamit ang .getLog() na paraan, habang kailangan mong isaalang-alang ang pagkakaroon ng mga bagong linyang character, ang mga huling opsyon ay maaaring ganito: assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); // or assertEquals("{2, 6, 1, 3}, max = 6", "6\r\n", log.getLog()); Sa pagitan ng mga pagsubok, upang iwasan ang layering ng data, kailangan mong i-clear ang log log.clear(); Ang buong teksto ng aking klase sa pagsubok: import org.junit.Rule; import org.junit.Test; import org.junit.contrib.java.lang.system.StandardOutputStreamLog; import org.junit.contrib.java.lang.system.TextFromStandardInputStream; import static org.junit.Assert.*; import static org.junit.contrib.java.lang.system.TextFromStandardInputStream.emptyStandardInputStream; public class UtilAppTest { @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); @Test public void testAddition() throws Exception { systemInMock.provideText("4\n2\n6\n1\n3\n"); UtilApp utilApp = new UtilApp(); utilApp.main(new String[]{}); assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); systemInMock.provideText("5\n-100\n-6\n-15\n-183\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{-100, -6, -15, -183, -1}, max = -1", "-1", log.getLog().trim()); systemInMock.provideText("3\n2\n0\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{2, 0, -1}, max = 2", "2", log.getLog().trim()); } } Naglulunsad kami at nag-e-enjoy. -=!!! MAHALAGA!!!=- Ang materyal na ito ay ibinigay para sa mga layuning pang-impormasyon LAMANG; Hindi ko ginagarantiyahan ang matagumpay na pagsubok ng gawain sa server kung mayroong extraneous na klase sa package na may gawain. Bago magpadala ng isang gawain para sa pag-verify sa server, alisin ang lahat ng hindi kailangan: hindi kinakailangang mga file, hindi kinakailangang mga klase, nagkomento na code. Ang matagumpay na pagkumpleto ng mga pagsubok na iyong ginawa ay hindi ginagarantiyahan ang matagumpay na pagkumpleto ng mga pagsubok sa server. Sinadya kong hindi ngumunguya ang teoretikal na materyal: ang teorya ng pagsubok sa yunit, mga anotasyon ng JUnit, igiit, atbp., Ang lahat ng materyal ay nasa mga link na ibinigay sa teksto. Marahil mayroon kang sariling mga paraan ng pagsubok sa mga gawain, ikalulugod kong talakayin ang mga ito sa iyo sa mga komento.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION