JavaRush /Java блогу /Random-KY /JavaRush үчүн JUnit же үйдө тестирлөө жөнүндө бир аз.
Sdu
Деңгээл

JavaRush үчүн JUnit же үйдө тестирлөө жөнүндө бир аз.

Группада жарыяланган
Тапшырмаңызды текшерүү үчүн консолго ондогон жолу тесттик маалыматтарды терүүдөн чарчадыңызбы? Кошка кош келиңиз, мен сизге аны менен эмне кыла аларыңызды айтып берем. Бул материалдын түпкү максаты ар кандай параметрлер менен чечorп жаткан тапшырманы ишке киргизүүнү автоматташтыруу жана анын баштапкы codeуна өзгөртүүлөрдү киргизбестен натыйжаларды текшерүү болот. Сиз, балким, аталышынан түшүнгөндөй, бул жөнөкөй маселеде биздин негизги жардамчыбыз JUnit болот . Эгер сиз бирдикти тестирлөө жана бирдик тесттери жөнүндө уга элек болсоңуз , мен сизге бир аз тыныгууну жана бул түшүнүктөр менен таанышууну сунуштайм, бактыга жараша, Интернетте маалымат жетиштүү. Жок, каалабайсыңбы? Макул, бул эмне болуп жатканын түшүнүү үчүн чоң көйгөй болбойт деп ойлойм. Кантсе да, сиз тест жана жалпы эле сыноо эмне экенин билесизби? Тапшырмаңызды ишке киргизген сайын муну жасайсыз, баштапкы маалыматтарды киргизиңиз жана натыйжаны сиз күткөн нерсе менен салыштырыңыз.
Салам, дүйнө JUnit!
JUnit деген эмне? Долбоордун расмий сайтында биз төмөндөгү сүрөттөлүштү окуй алабыз:
JUnit кайталануучу тесттерди жазуу үчүн жөнөкөй негиз болуп саналат. Бул бирдик тестирлөө алHowтары үчүн xUnit архитектурасынын мисалы.
Биз үчүн бул методдору биздин программа менен өз ара аракеттене турган атайын иштелип чыккан класстарды жазуу, алынган натыйжаны шилтеме менен салыштыруу жана эгер алар дал келбесе, бизге билдирүү мүмкүнчүлүгүн билдирет. Принципти түшүнүү үчүн жөнөкөй мисалды карап көрөлү. Бизде жардамчы класс бар дейли, анын методдорунун бири int түрүндөгү эки өзгөрмөлөрдү алып , алардын суммасын кайтарат: JavaRush үчүн JUnit же үйдө тестирлөө жөнүндө бир аз.  - 1 Бул биз сынап көрүүгө аракет кыла турган функция. Бактыга жараша, биздин сүйүктүү IDEA-да тесттерди тез түзүү үчүн зарыл болгон нерселердин баары бар, бизге курсорду класс декларациясынын сабына жайгаштыруу, "Alt + Enter" баскычтарын басып, контексттик менюдан "Тестти түзүү" баскычын тандоо керек: JavaRush үчүн JUnit же үйдө тестирлөө жөнүндө бир аз.  - 2 Кайда экенин көрсөткөндөн кийин. сиз тест түзүшүңүз керек, IDEA тестирлөө китепканасын тандоону сунуштайт (бул материалда мен JUnit4 колдоном; китепкана класстары долбоорго туташуу үчүн "Оңдоо" баскычын басышыңыз керек), текшерилүүчү ыкмалар жана кошумча опциялар. JavaRush үчүн JUnit же үйдө тестирлөө жөнүндө бир аз.  - 3 IDE тест классынын үлгүсүн түзөт: ClassName = TestClassName + "Test" MethodName = "test" + TestMethodName JavaRush үчүн JUnit же үйдө тестирлөө жөнүндө бир аз.  - 4 Биз жөн гана методдун корпусун толтурушубуз керек. Буга JUnit тарабынан сунушталган "Тактоо" деп аталган ыкмалар жардам берет . Жөнөкөйлөштүрүлгөн түрдө алардын иши төмөнкүчө көрүнөт: күтүлгөн натыйжа жана текшерorп жаткан ыкманы чакыруунун натыйжасы .assert* ыкмасына өткөрүлүп берилет, ыңгайлуулук үчүн биринчи параметр катары түшүндүрмө билдирүүнү кошо аласыз. Сыноо учурунда параметрлер дал келбесе, бул тууралуу сизге маалымат берилет. Кадимки класс сыяктуу эле аткаруу үчүн сыноо классын ишке киргизсеңиз болот, мен Ctrl+Shift+F10 баскыч айкалышын колдонууну жактырам JavaRush үчүн JUnit же үйдө тестирлөө жөнүндө бир аз.  - 5
тапшырманы тактайлы
Теориялык жактан алганда, баары жөнөкөй жана кооз, бирок сунушталган мисалдын контекстинде, бул чынында эле зарыл эмес, биз компьютерге эки санды кошууга ишенсек болот. Бизге JavaRush студенттери чечкен реалдуу көйгөйлөрдүн кандай болору көбүрөөк кызыкдар, мисалы, мен сүйүктүү level05.lesson12.bonus03 алууну сунуштайм.
/* Алгоритмдер боюнча маселе Төмөнкү программаны жазыңыз, ал: 1. консолдон N > 0 санын киргизет 2. андан кийин консольдон N санды киргизет 3. киргизилген N сандын максимумун көрсөтөт. */
Оң, терс сандар жана аралаш топтом үчүн үч тест жазуубуз керек.
Токойго барган сайын...
Бул жерде бизди сюрприздер күтүп турат: 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); } }
  • Программанын логикасы main() методуна жайгаштырылат
  • Булак маалыматтары методго берилбейт, бирок клавиатурадан киргизилет.
  • main() ыкмасы натыйжаны кайтарbyte, бирок аны консолго чыгарат.
Эгерде биринчи пункт өзгөчө көйгөйлүү болбосо (биз негизги () ыкмасын демейдегидей деп атасак болот), анда кийинки экөө бизди темага тереңирээк кирип, мээбизди чыңдоого мажбурлайт. Мен көйгөйдү чечүүнүн бир нече жолун таптым:
  1. Максималдууну табуу логикасын өзүнчө ыкмага жылдыруу.
    • Жакшы жактары: Рефакторинг жагынан туура мамиле
    • Жаман жактары: Программа codeго, керексиз структураларга толуп калат, жок дегенде массив же ArrayList кошулат (даамына жана түсүнө жараша...). Максималдууну табуу механизми гана текшерилет, маалыматтарды киргизүү жана чыгаруу текшерилбейт.
  2. System.in/System.out үчүн пакеттерди жазуу.
    • Жакшы жактары: Биз үчүнчү тараптын китепканаларын колдонбойбуз.
    • Жаман жактары: жол үйрөнчүктөр үчүн эмес. Тестти ишке ашыруунун салыштырмалуу татаалдыгы; тесттеги codeдун көлөмү текшерorп жаткан тапшырмага караганда көбүрөөк болушу мүмкүн.
  3. Тесттер үчүн кошумча китепканаларды колдонуу.
    • Артыкчылыктары: Тесттердеги таза code, тест жазуунун салыштырмалуу жеңилдиги. Текшерorп жаткан класстын баштапкы codeу өзгөртүлбөйт.
    • Жаман жактары: долбоорго үчүнчү тараптын китепканаларын туташтыруу керек.
Чынын айтсам, мага үчүнчү вариант абдан жакты, ошондуктан аны ишке ашырууга аракет кылалы.
Системанын эрежелери
Кыска издөө мени http://stefanbirkner.github.io/system-rules/ баракчасына алып келди жана бул мага керек экени дароо айкын болду.
Java.lang.System колдонгон codeду сыноо үчүн JUnit эрежелеринин жыйнагы.
Ошентип, китепкананы жүктөп алалы . Системанын эрежелери иштеши үчүн зарыл болгон Commons IO китепканасын жүктөп алыңыз . Биз эки китепкананы тең проектибизге туташтырабыз (Файл -> Долбоордун структурасы -> Китепканалар -> + -> Java) жана скульптураны баштайбыз: Ишке киргизгенден кийин, биздин тапшырма консолдон N+1 сандарын киргизүүнү суранат, анда биринчи сан сизге айтып берет. анын артынан канча сан келет. Системалык эрежелерде бул максаттар үчүн TextFromStandardInputStream классы колдонулат.Башында биз тест классыбызга ушул типтеги талааны кошуп, @Rule annotationсы менен белгилешибиз керек: @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); Андан кийин түздөн-түз тест методунда биз керектүү маалыматтарды көрсөтөбүз: systemInMock.provideText("4\n2\n6\n1\n3\n"); Көрүнүп тургандай, сандар текст түрүндө берorп, "\n" дефис саптары менен бөлүнгөн. Мунун негизинде N 4кө барабар экени аныкталып, биз {2, 6, 1, 3} сандарынан максимум издейбиз. Андан кийин, биз сыналып жаткан класстын мисалын түзүп, main() ыкмасын чакырышыбыз керек. Биздин программа systemInMock'тен маалыматтарды окуп, аны иштетип, натыйжаны басып чыгарат жана биз аны окуп, стандарт менен салыштырышыбыз керек. Бул үчүн, система эрежелери бизге StandardOutputStreamLog классын берет. Көрсөтүлгөн түрдөгү талааны кошобуз: @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); Басып чыккан маалыматтарды .getLog() ыкмасы менен окуй аласыз, ал эми жаңы саптын символдорунун бар экендигин эске алуу керек болсо, акыркы варианттар төмөнкүдөй болушу мүмкүн: assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); // or assertEquals("{2, 6, 1, 3}, max = 6", "6\r\n", log.getLog()); Тесттердин ортосунда, маалыматтардын катмарлануусунан качуу үчүн, сиз журналды тазалашыңыз керек log.clear(); Менин тест классымдын толук тексти: 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()); } } Биз ишке киргизебиз жана ырахат алабыз. -=!!! МААНИЛҮҮ!!!=- Бул материал маалыматтык максатта гана берилген; Эгерде тапшырма менен пакетте тышкаркы класс бар болсо, мен serverде тапшырманы ийгorктүү текшерүүгө кепилдик бере албайм. Серверге текшерүү үчүн тапшырманы жөнөтүүдөн мурун, бардык ашыкча нерселерди алып салыңыз: керексиз файлдар, керексиз класстар, комментарий берилген code. Сиз түзгөн тесттердин ийгorктүү аякташы serverдеги сыноолордун ийгorктүү аякташына кепилдик бербейт. Мен теориялык материалды атайылап чайнаган жокмун: бирдикти текшерүү теориясы, JUnit annotationлары, assert ж.б., бардык материалдар текстте берилген шилтемелерде. Балким, сизде тестирлөөнүн өз жолдору бардыр, мен аларды комментарийлерде сиз менен талкуулоого кубанычтамын.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION