JavaRush /Java Blogu /Random-AZ /Məşğulluq üçün test tapşırığı, gəlin bunu anlayaq..
timurnav
Səviyyə

Məşğulluq üçün test tapşırığı, gəlin bunu anlayaq..

Qrupda dərc edilmişdir
Dostlar, hamıya salam. Mən Rusiya şirkətində Java tərtibatçısı vəzifəsi üçün test tapşırığını həll etmək təcrübəmi sizinlə bölüşmək istəyirəm. Dərhal deyim ki, tapşırığın əsas funksionallığını həyata keçirmək o qədər də çətin deyil, amma həmişə olduğu kimi, təfərrüatlar və xırda şeylər vacibdir, bu da onu vaxtında təqdim etməyimə mane oldu; onlar heç vaxt tapşırıqla bağlı heç bir cavab vermədilər - onların vakansiyaları onlara göndərəndə artıq dolu idi. Məndən tələb olunan hər şeyi edib-etmədiyimi görmək üçün tapşırığa nəzər salmağı təklif edirəm. Bunu necə edəcəyini bilməyənlər üçün, bununla necə məşğul olduğum barədə çoxlu su əlavə edəcəyəm. Əgər kimsə bununla maraqlanırsa, pişiyə xoş gəlmisiniz. Dərhal deyəcəyəm ki, bütün həlli burada yerləşdirməyəcəm, amma yeni başlayanlar üçün çoxlu izahat olacaq, əgər kimsə mənim çıxışlarımı oxumaqda maraqlı deyilsə, github-da layihə budur . tapşırığın mətni.
Test tapşırığı №1
Təsvir: API Server (JSON HTTP API) İnkişaf Alətləri: Java Framework: Play Framework 2.4 (və ya daha yüksək) və ya Spring boot 1.2.3 (və ya daha yüksək) Verilənlər bazası: MySQL Protokolu: HTTP, port 80 Funksionallıq (sorğular):
  1. Yükləyici.
    • Faylı (JPG avatar şəkli) serverə köçürürük.
    • Şəkli serverdəki kataloqda saxlayırıq.
    • Server cavabı şəklin daxili URI-dir.
  2. Yeni istifadəçi əlavə olunur.
    • İstifadəçinin şəxsi məlumatlarını serverə (şəklin URI-si, istifadəçi adı, e-poçt və s.) ötürürük.
    • Məlumatları verilənlər bazasında saxlayırıq.
    • Server cavabı yeni istifadəçinin unikal identifikatorudur.
  3. İstifadəçi haqqında məlumat əldə etmək.
    • Biz serverə unikal istifadəçi identifikatorunu ötürürük.
    • Verilənlər bazasından məlumatların oxunması.
    • Serverin cavabı istifadəçinin şəxsi məlumatlarıdır (yuxarıya bax).
  4. İstifadəçi statusunun dəyişdirilməsi (Onlayn, Oflayn).
    • Biz unikal istifadəçi identifikatorunu və yeni statusu (Onlayn, Oflayn) serverə ötürürük.
    • İstifadəçi statusunun dəyişdirilməsi.
    • Server cavabı - unikal istifadəçi ID, yeni və əvvəlki status.
    Qeyd: Server xarici API/verilənlər bazasını sorğulayır. Bu sadələşdirilmiş test tapşırığı olduğundan, simulyasiya edilmiş giriş və 5-10 saniyə gecikmə ilə "stub" tətbiq etmək lazımdır.
  5. Server statistikası.
    • Parametrləri serverə ötürürük: 1. müştəri statusu (Onlayn, Oflayn və ya yoxdur), 2. Sorğunun unikal ID-si (vaxt damğası) (olmaya bilər)
    • Server cavabı statusları və şəkil URI-ləri, eləcə də sorğunun unikal ID-si (vaxt damğası) olan istifadəçilərin siyahısıdır.
    Qeyd: Sorğuda parametrlər varsa, server cavabını onlara görə filtrləməlidir. Əgər sorğu sorğunun unikal identifikatorunu (vaxt damğası) ehtiva edirsə (əvvəllər qəbul edilib), onda server yalnız statusları bu unikal ID-dən (vaxt damğasından) sonra (vaxtında) dəyişmiş istifadəçiləri qaytarmalıdır.
Məcburi tələblər:
- İstirahət. - Bütün məlumatlar JSON formatındadır. - API serveri 3 və 5-ci sorğuların ən yüksək prioritetə ​​malik olması (sorğu 1, 2, 4-ə nisbətən) nəzərə alınmaqla tərtib edilməlidir və mümkün qədər tez tamamlanmalıdır. - Emal zamanı xəta.
Əlavə tələblər (arzu olunur):
- Kodun sənədləşdirilməsi. - API Server arxitekturası yüksək yükləmə və miqyaslama üçün nəzərdə tutulmalıdır. - Testlər.
Test nəticəsi:
- Test tapşırığının nəticəsi arxivdə və onun yerləşdirilməsi üçün ətraflı təlimatlarla təmin edilməlidir. Test tapşırığı üçün Docker konteynerini qurmaq üçün Dockerfile əlavə etmək məsləhətdir. github.com saytından endirilə bilər. - Yaradılmış API-nin qısa sənədlərini (sorğuların siyahısı, sorğu parametrləri, sorğu formatları, cavab formatları və s.) ehtiva etməlidir. - Kontekstdə test tapşırığına sərf olunan vaxt haqqında məlumat: dizayn, proqramlaşdırma, sənədləşdirmə və s. Nəzərə alın ki, bu test tapşırığı yalnız bilik və bacarıqları qiymətləndirmək üçün nəzərdə tutulub və hazır məhsul (API server) yaratmaq məqsədi daşımır, buna görə də izahat və səbəblərlə sadələşdirmələrə icazə verilir.
diqqətli və təcrübəli proqramçılar növbəti bölməni keçə bilərlər, burada mən tapşırığın mətni ilə məşğul olacağam. Tapşırığın "başlığı" başa düşməkdə heç bir çətinlik yaratmır, ona görə deyim ki, seçimim Spring Boot-a düşdü, amma onunla artıq bir şey etdiyim üçün deyil, istifadə edərək artıq real layihəni tamamladığım üçün. Bahar (amma Boot orada deyildi, çünki sadəliyinə görə başa düşürəm). Server funksionallığına görə: 1) Fayl yükləyicisi. Burada əsasən mürəkkəb bir şey yoxdur, sadəcə olaraq şəkillərin serverdə necə saxlandığını anlamaq lazım idi, məlum oldu ki, ən əlverişli yol onları sadəcə hansısa xüsusi qovluğa yerləşdirməkdir. Aşağıda konkret icraya baxacağıq. 2) Yeni istifadəçi əlavə etmək, sadə əməliyyat, əgər siz nə vaxtsa CRUD proqramları etmisinizsə, o zaman mənə dəstək olacaq, olmasa, aşağıda hər şeyi görəcəksiniz. 3) İstifadəçi haqqında məlumatların əldə edilməsi. sual yoxdur - hər şey aydındır. 4) İstifadəçi statusunun dəyişdirilməsi. tapşırığın ilk iki bəndi gün kimi aydındır, bəs xarici sorğu??? Bunu 100 qr olmadan başa düşmək mümkün deyil, hətta indi də düzgün başa düşdüyümə 100% əmin deyiləm. Aşağıdakı təfərrüatlar. 5) Server statistikası. Bu da maraqlıdır. Birinci nöqtə, parametrlər üçün müxtəlif variantları olan bir metodun həyata keçirilməsini təklif edir, bunun bir nəzarətçi metodu olması lazım olduğunu nəzərə alsaq, bunun necə ediləcəyi hələ aydın deyil. ikinci nöqtə, bir an sonra statusu dəyişmiş bütün istifadəçilərdən soruşur, aydın görünür, lakin incəliklər var.
Başlanır
oh, bu tapşırıq üzərində işləyərkən bu ifadəni neçə dəfə oxudum! Əgər siz nə vaxtsa Baharda necə layihə quracağınızı anlamağa çalışmısınızsa, lakin nədənsə Spring Boot-u heç sınamamısınızsa, təbrik edirəm, aşağıda yazacaqlarımdan sadəcə məmnun qalacaqsınız. Haradasa oxumuşdum ki, proqramçılar layihədən layihəyə çox böyük miqdarda kod ötürürdülər, bu, şablon kodudur - verilənlər bazasına qoşulma parametrləri, servlet xəritələri və s., və s. ilə işləmək üçün şablon kodu Biz verilənlər bazası üçün JPA/Hibernate istifadə edirik, onlar bəzi şablonları gizlədirlər, lakin onları konfiqurasiya etmək üçün yenidən xml faylı və ya konfiqurasiya sinifləri yazmalısınız. və əgər kiçik bir layihəniz varsa, o zaman məlum olur ki, siz daha az kod yazırsınız, hətta əksinə. Sonra JPA ilə işi yazda bitiririk; bir çox layihələr var, lakin ən əlverişlisi, əlbəttə ki, Spring Data-dır. Bu, JPA və NoSQL və bir çox müxtəlif layihələr daxil olmaqla, ehtimal ki, mümkün olan hər şeylə işləyə bilən çox böyük bir layihədir, inanılmaz dərəcədə sehrlidir, biz onu layihəmizdə istifadə edəcəyik. Spring istifadə edərək, biz demək olar ki, verilənlər bazası əlaqə parametrlərindən xilas oluruq, Spring bizim üçün hər şeyi edir, sadəcə olaraq əməliyyat, keşləmə və xüsusi hallarda google (başqalarına baxın) kontekst konfiqurasiyasında bəzi digər parametrlərə dair lazımi qeydlərə sadiq qalmalıyıq. Ancaq eyni zamanda, təcrübəsiz tərtibatçıların əksəriyyəti Baharda bir layihə yaratmaq barədə heç bir fikri yoxdur. Localhost:8080/* ilə başlayan linki izləyərək layihəni icra etmək və brauzerdə nəticə əldə etmək üçün onu necə konfiqurasiya edəcəyini heç kim tam bilmir. Və sonra Spring Boot şəkilə gəlir! Spesifik bir nümunə ilə Spring Boot haqqında danışmaq daha yaxşıdır! Boşluqdan başlayaq. Spring Boot layihəsi yaratmaq üçün Spring tərtibatçıları şablonlar yaratmaq üçün "konstruktor" tapdılar. Onları veb saytında istifadə edə bilərsiniz, lakin bunu bizim sevimli IDE, Intellij IDEA-da etmək daha asandır. Və beləliklə: File->New->Project Pəncərədə Spring Initializr sekmesine keçin, orada jdk qurulmalıdır və URL https://start.spring.io, İnternet bağlantısını yoxlayın, sonra sizə lazım olacaq adı, sonra istifadə edəcəyimiz texnologiyaları seçmək üçün ilk mərhələdə bizə yalnız WEB lazımdır - onun yanında bir işarə qoyun və sonra layihə yaradılır. Maven-in bütün asılılıqları çıxarması üçün ideyada Maven sekmesini açmalıyıq və yeniləmə düyməsini sıxmalıyıq. Müştəri-server əlaqəsi üçün bütün parametrləri ehtiva edən hazır tətbiq şablonu aldıq. İlk təəssürat yaratmaq üçün gəlin nəzarətçi sinfi yaradaq (yəqin ki, hamımız MVC haqqında eşitmişik). Bütün Spring proqramlarında nəzarətçilər kifayət qədər sadə dizayna malikdirlər - bu, @Controller annotasiyası ilə işarələnmiş bir sinifdir (prefikslər mümkündür, məsələn, @RestController), bu sinif daxil olan sorğuların işlənməsi üçün cavabdehdir. Nəzarətçinin bəzi ünvan sorğusunu tanıması üçün siz bu ünvanı nəzarətçi metodu ilə əlaqələndirməlisiniz. import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/hello") public class DemoController { @RequestMapping(method = RequestMethod.GET) public String halloWorld() { return "Hello World!"; } @RequestMapping(value = "/{name}", method = RequestMethod.GET) public String halloName(@PathVariable("name") String name) { return "Hello, " + name + "!"; } } Gəlin burada nə baş verdiyini anlayaq. @RestController . yuxarıda yazdığım annotasiya. Nəticəni dərhal görmək istədiyimiz və .jsp səhifələri yazmaq istəmədiyimiz üçün istirahət nəzarətçisindən istifadə edirik (vay), nəticəni brauzerdə sətir kimi dərhal görmək bizim üçün daha asan olacaq. @RequestMapping sadəcə bir ünvan üçün məcburidir. Ümumi ünvan prefiksi belə olacaq: localhost:8080. Gördüyümüz kimi, bütün sinif /hello ünvanında asılır , bu o deməkdir ki, bu sinif daxilindəki bütün metodlarda localhost:8080/hello prefiksi var. Sonra sinfin birinci metodudur, öz xəritəsində Http protokolu metodu göstərilir - GET sorğusu (Http protokol üsulları haqqında özünüz üçün oxuyun) Bütün bunlar nə deməkdir? localhost:8080/hello ünvanına GET sorğusu etməklə biz “Salam Dünya!” sətri şəklində cavab alacağıq, yoxlayaq! DemoApplication sinifində, bütün Bahar kontekstini təkbaşına işə salmaq üçün deyə biləcəyimiz bir gözəl annotasiya var - @SpringBootApplication. Bu sinfin əsas metodu sehrli olur, sadəcə SpringApplication-da gizlənmiş bütün sehrləri işə salır, əgər bu sinifdə kontekst menyusuna zəng etsəniz, Run xəttində seçimlər görünəcək, mən onu yaşıl işarə ilə erkən işə salmağı məsləhət görürəm. konsol daha gözəl görünəcək və gələcəkdə logları birbaşa ondan oxumaq daha asan olacaq. Tətbiqi işə salaq. konsol çıxışı dayandıqda, konsolda görməlisiniz
2015-09-02 09:25:36.895 INFO 5844 --- [ əsas] sbcetTomcatEmbeddedServletContainer : Tomcat port(lar)da işə salındı: 8080 (http) 2015-09-02 09:25:34 -- [9:25:34-]. demo.DemoApplication: DemoTətbiqi **** saniyə ərzində başladı (JVM 15.501 üçün işləyir)
burada "****" tətbiqin işə salınma müddətidir :) bundan sonra istənilən brauzerdə (və ya qıvrım və ya hər hansı istifadə etdiyiniz?) nəzarətçi metodunun xəritələndiyi ünvanı yazmalısınız.
localhost: 8080/salam
Brauzer kanonik göstərməlidir
Salam Dünya!
Budur sizin üçün veb proqram! Nəzarətçidə başqa bir üsul olduğunu görsəniz, onun öz ünvan xəritələşdirilməsi var; cari ünvana bir yer tutucu əlavə olunur. Hansı ki, Spring tərəfindən metoda parametr kimi ötürülür. Bunun üçün @PathVariable annotasiyasının məsuliyyət daşıdığını təxmin etmək çətin deyil. Beləliklə, xahişlə
localhost:8080/salam/Adınız
brauzer göstərəcək
Salam, adınız!
Spring Boot-un əsaslarını sıraladıq. Sonra verilənlər bazasını əlavə edəcəyik, lakin bu, növbəti yazıda olacaq. Hamıya təşəkkürlər.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION