JavaRush /จาวาบล็อก /Random-TH /งานทดสอบการจ้างงาน มาหาคำตอบกัน..
timurnav
ระดับ

งานทดสอบการจ้างงาน มาหาคำตอบกัน..

เผยแพร่ในกลุ่ม
เพื่อน ๆ สวัสดีทุกคน ฉันต้องการแบ่งปันประสบการณ์ของฉันในการแก้ปัญหางานทดสอบสำหรับตำแหน่งนักพัฒนา Java ใน บริษัท รัสเซีย ฉันจะบอกทันทีว่าการใช้ฟังก์ชันหลักของการมอบหมายงานนั้นไม่ใช่เรื่องยากเป็นพิเศษ แต่เช่นเคยรายละเอียดและสิ่งเล็ก ๆ น้อย ๆ ก็มีความสำคัญซึ่งทำให้ฉันไม่สามารถส่งงานได้ตรงเวลา พวกเขาไม่เคยตอบอะไรเลยเกี่ยวกับงานที่ได้รับมอบหมาย - ตำแหน่งว่างของพวกเขา เมื่อเราส่งไปให้พวกเขาก็เต็มแล้ว ฉันขอแนะนำให้คุณตรวจสอบงานเพื่อดูว่าฉันได้ทำทุกอย่างที่ต้องการแล้วหรือไม่ และสำหรับผู้ที่ไม่รู้ว่าต้องทำอย่างไร ฉันจะเติมน้ำลงไปเยอะมากเกี่ยวกับวิธีจัดการกับมัน หากใครสนใจเรื่องนี้ยินดีต้อนรับน้องแมวค่ะ ฉันจะบอกทันทีว่าฉันจะไม่โพสต์โซลูชันทั้งหมดที่นี่ แต่จะมีคำอธิบายมากมายสำหรับผู้เริ่มต้น ถ้าใครไม่สนใจที่จะอ่านการหลั่งไหลของฉัน นี่คือโครงการบน github ฉันจะเริ่มต้นด้วย ข้อความของงานเอง
งานทดสอบหมายเลข 1
คำอธิบาย: เครื่องมือพัฒนา เซิร์ฟเวอร์ API (JSON HTTP API) : Java Framework: Play Framework 2.4 (หรือสูงกว่า) หรือ Spring boot 1.2.3 (หรือสูงกว่า) ฐานข้อมูล: โปรโตคอล MySQL : HTTP, พอร์ต 80 ฟังก์ชันการทำงาน (คำขอ):
  1. รถตักดิน
    • เราถ่ายโอนไฟล์ (รูปภาพประจำตัว JPG) ไปยังเซิร์ฟเวอร์
    • เราบันทึกรูปภาพไว้ในไดเร็กทอรีบนเซิร์ฟเวอร์
    • การตอบสนองของเซิร์ฟเวอร์คือ URI ภายในของรูปภาพ
  2. การเพิ่มผู้ใช้ใหม่
    • เราถ่ายโอนข้อมูลส่วนบุคคลของผู้ใช้ไปยังเซิร์ฟเวอร์ (URI ของรูปภาพ ชื่อผู้ใช้ อีเมล ฯลฯ)
    • เราบันทึกข้อมูลในฐานข้อมูล
    • การตอบสนองของเซิร์ฟเวอร์คือ ID เฉพาะของผู้ใช้ใหม่
  3. การรับข้อมูลเกี่ยวกับผู้ใช้
    • เราส่ง ID ผู้ใช้ที่ไม่ซ้ำกันไปยังเซิร์ฟเวอร์
    • การอ่านข้อมูลจากฐานข้อมูล
    • การตอบสนองของเซิร์ฟเวอร์คือข้อมูลส่วนบุคคลของผู้ใช้ (ดูด้านบน)
  4. การเปลี่ยนสถานะผู้ใช้ (ออนไลน์, ออฟไลน์)
    • เราถ่ายโอน ID ผู้ใช้เฉพาะและสถานะใหม่ (ออนไลน์, ออฟไลน์) ไปยังเซิร์ฟเวอร์
    • การเปลี่ยนสถานะผู้ใช้
    • การตอบสนองของเซิร์ฟเวอร์ - ID ผู้ใช้ที่ไม่ซ้ำกัน สถานะใหม่และสถานะก่อนหน้า
    หมายเหตุ: เซิร์ฟเวอร์กำลังสอบถาม API/ฐานข้อมูลภายนอก เนื่องจากนี่เป็นงานทดสอบแบบง่าย จึงจำเป็นต้องใช้ "stub" ที่มีการเข้าถึงจำลองและการหน่วงเวลา 5-10 วินาที
  5. สถิติเซิร์ฟเวอร์
    • เราถ่ายโอนพารามิเตอร์ไปยังเซิร์ฟเวอร์: 1. สถานะไคลเอนต์ (ออนไลน์ ออฟไลน์ หรือขาดหายไป) 2. ID เฉพาะ (ประทับเวลา) ของคำขอ (อาจหายไป)
    • การตอบสนองของเซิร์ฟเวอร์คือรายชื่อผู้ใช้ที่มีสถานะและ URI รูปภาพ รวมถึง ID เฉพาะ (การประทับเวลา) ของคำขอ
    หมายเหตุ: หากคำขอมีพารามิเตอร์ เซิร์ฟเวอร์จะต้องกรองการตอบสนองตามพารามิเตอร์เหล่านั้น หากคำขอมี ID เฉพาะ (การประทับเวลา) ของคำขอ (ได้รับก่อนหน้านี้) เซิร์ฟเวอร์ควรส่งคืนเฉพาะผู้ใช้ที่มีสถานะเปลี่ยนแปลงหลังจาก (ในเวลา) ID ที่ไม่ซ้ำกันนี้ (การประทับเวลา)
ข้อกำหนดบังคับ:
- สงบ - ข้อมูลทั้งหมดอยู่ในรูปแบบ JSON - เซิร์ฟเวอร์ API ควรได้รับการออกแบบโดยคำนึงถึงคำขอที่ 3 และ 5 มีลำดับความสำคัญสูงสุด (สัมพันธ์กับคำขอที่ 1, 2, 4) และจะต้องดำเนินการให้เสร็จสิ้นโดยเร็วที่สุด - เกิดข้อผิดพลาดในการประมวลผล
ข้อกำหนดเพิ่มเติม (พึงประสงค์):
- เอกสารประกอบรหัส - สถาปัตยกรรมเซิร์ฟเวอร์ API จะต้องได้รับการออกแบบสำหรับการโหลดและการปรับขนาดที่สูง - การทดสอบ
ผลการทดสอบ:
- ต้องระบุผลลัพธ์ของงานทดสอบในไฟล์เก็บถาวรพร้อมคำแนะนำโดยละเอียดสำหรับการปรับใช้ ขอแนะนำให้แนบ Dockerfile เพื่อสร้างคอนเทนเนอร์ Docker สำหรับงานทดสอบ สามารถดาวน์โหลดได้ที่ github.com - ควรมีเอกสารประกอบโดยย่อของ API ที่สร้างขึ้น (รายการคำขอ พารามิเตอร์คำขอ รูปแบบคำขอ รูปแบบการตอบสนอง ฯลฯ) - ข้อมูลเกี่ยวกับเวลาที่ใช้ในงานทดสอบในบริบทของ: การออกแบบ การเขียนโปรแกรม เอกสาร ฯลฯ โปรดทราบว่างานทดสอบนี้มีวัตถุประสงค์เพื่อประเมินความรู้และทักษะเท่านั้น และไม่ได้มีจุดมุ่งหมายเพื่อสร้างผลิตภัณฑ์สำเร็จรูป (เซิร์ฟเวอร์ API) ดังนั้นจึงอนุญาตให้มีคำอธิบายและเหตุผลที่เรียบง่ายขึ้น
โปรแกรมเมอร์ที่เอาใจใส่และมีประสบการณ์สามารถข้ามส่วนถัดไปได้ ฉันจะจัดการกับข้อความของงานเองที่นี่ “ส่วนหัว” ของงานไม่ได้ทำให้เกิดปัญหาในการทำความเข้าใจ ดังนั้นฉันจะบอกว่าตัวเลือกของฉันตกอยู่ที่ Spring Boot แต่ไม่ใช่เพราะฉันได้ทำบางอย่างกับมันไปแล้ว แต่เป็นเพราะฉันได้ทำโปรเจ็กต์จริงโดยใช้เสร็จแล้ว Spring (แต่ไม่มี Boot อยู่ที่นั่นอย่างที่ฉันเข้าใจเพราะความเรียบง่ายของมัน) ตามฟังก์ชันการทำงานของเซิร์ฟเวอร์: 1) ตัวดาวน์โหลดไฟล์ โดยพื้นฐานแล้วไม่มีอะไรซับซ้อนที่นี่ ฉันแค่ต้องหาวิธีจัดเก็บรูปภาพบนเซิร์ฟเวอร์โดยทั่วไป ปรากฎว่าวิธีที่สะดวกที่สุดคือเพียงวางไว้ในไดเร็กทอรีพิเศษ เราจะดูการใช้งานเฉพาะด้านล่าง 2) การเพิ่มผู้ใช้ใหม่ การดำเนินการง่ายๆ หากคุณเคยสร้างแอปพลิเคชัน CRUD มาก่อน เขาจะสนับสนุนฉัน ถ้าไม่ คุณจะเห็นทุกอย่างด้านล่าง 3) การรับข้อมูลเกี่ยวกับผู้ใช้ ไม่มีคำถาม - ทุกอย่างชัดเจน 4) การเปลี่ยนสถานะผู้ใช้ สองจุดแรกของงานชัดเจนเหมือนวัน แต่คำขอภายนอกล่ะ??? มันเป็นไปไม่ได้เลยที่จะคิดออกถ้าไม่มี 100 กรัม แม้ว่าตอนนี้ฉันก็ไม่แน่ใจ 100% ว่าฉันเข้าใจถูกต้องหรือไม่ รายละเอียดด้านล่าง 5) สถิติเซิร์ฟเวอร์ นี่ก็น่าสนใจเช่นกัน จุดแรกแนะนำให้ใช้วิธีการที่มีตัวเลือกต่างๆ สำหรับพารามิเตอร์ ซึ่งยังไม่ชัดเจนว่าจะต้องทำอย่างไร เนื่องจากนี่ควรเป็นวิธีการควบคุม ประเด็นที่สองถามผู้ใช้ทุกคนที่มีสถานะเปลี่ยนไปหลังจากผ่านไปครู่หนึ่ง ดูเหมือนชัดเจน แต่ก็มีรายละเอียดปลีกย่อย
เริ่มต้นใช้งาน
โอ้ ฉันอ่านวลีนี้กี่ครั้งแล้วในขณะที่ฉันกำลังทำงานนี้! หากคุณเคยพยายามหาวิธีตั้งค่าโปรเจ็กต์ใน Spring แต่ด้วยเหตุผลบางอย่างที่คุณไม่เคยลองใช้ Spring Boot ขอแสดงความยินดี คุณจะพอใจกับสิ่งที่ฉันจะเขียนด้านล่าง ฉันอ่านเจอบางที่ที่โปรแกรมเมอร์เคยถ่ายโอนโค้ดจำนวนมากจากโปรเจ็กต์หนึ่งไปอีกโปรเจ็กต์ นี่คือโค้ดเทมเพลต - การตั้งค่าสำหรับการเชื่อมต่อกับฐานข้อมูล การทำแผนที่เซิร์ฟเล็ต ฯลฯ เป็นต้น เพื่อลดปริมาณของ รหัสเทมเพลตสำหรับการทำงานร่วมกับ เราใช้ JPA/Hibernate สำหรับฐานข้อมูล โดยจะซ่อนเทมเพลตบางส่วนไว้ แต่ในการกำหนดค่า คุณจะต้องเขียนไฟล์ xml หรือคลาสการกำหนดค่าอีกครั้ง และถ้าคุณมีโปรเจ็กต์เล็ก ๆ ปรากฎว่าคุณเขียนโค้ดไม่น้อย แต่ในทางกลับกันด้วย ต่อไปเราจะสรุปการทำงานกับ JPA ใน Spring มีหลายโครงการ แต่ที่สะดวกที่สุดคือ Spring Data นี่เป็นโปรเจ็กต์ขนาดใหญ่มากที่สามารถทำงานได้กับทุกสิ่งที่เป็นไปได้ รวมถึง JPA และ NoSQL และโปรเจ็กต์อื่นๆ อีกมากมาย มันวิเศษมาก เราจะใช้มันในโครงการของเรา การใช้ Spring เราเกือบจะกำจัดการตั้งค่าการเชื่อมต่อฐานข้อมูล Spring ทำทุกอย่างให้เรา เราแค่ต้องใส่คำอธิบายประกอบที่จำเป็นเกี่ยวกับการทำธุรกรรม การแคช และในกรณีพิเศษ Google (ดูที่ผู้อื่น) การตั้งค่าอื่นๆ บางอย่างในการกำหนดค่าบริบท แต่ในขณะเดียวกัน นักพัฒนามือใหม่ส่วนใหญ่ไม่มีความคิดเลยว่าจะสร้างโปรเจ็กต์ใน Spring ได้อย่างไร ไม่มีใครรู้วิธีการกำหนดค่าให้รันโปรเจ็กต์และรับผลลัพธ์ในเบราว์เซอร์โดยไปที่ลิงก์ที่ขึ้นต้นด้วย localhost:8080/* และแล้ว Spring Boot ก็เข้ามาในภาพ! เป็นการดีกว่าที่จะพูดถึง Spring Boot ด้วยตัวอย่างที่เฉพาะเจาะจง! เริ่มจากช่องว่างกันก่อน ในการสร้างโปรเจ็กต์ Spring Boot นักพัฒนาของ Spring ได้มาพร้อมกับ “ตัวสร้าง” สำหรับสร้างเทมเพลต คุณสามารถใช้มันบนเว็บไซต์ของพวกเขาได้ แต่ทำได้ง่ายกว่ามากใน IDE ที่เราชื่นชอบ Intellij IDEA ดังนั้น: ไฟล์->ใหม่->โครงการ ในหน้าต่าง ไปที่แท็บ Spring Initializr ควรตั้งค่า jdk และ URL https://start.spring.io ตรวจสอบการเชื่อมต่ออินเทอร์เน็ต จากนั้นคุณจะต้อง เพื่อเลือกชื่อ จากนั้นเทคโนโลยีที่เราจะใช้ ในขั้นตอนแรกเราต้องการเพียงเว็บ - ทำเครื่องหมายถูกข้างๆ แล้วโปรเจ็กต์จะถูกสร้างขึ้น เพื่อให้ Maven ดึงการขึ้นต่อกันทั้งหมดออกมา เราจำเป็นต้องเปิดแท็บ Maven ในไอเดียแล้วคลิกปุ่มอัปเดต เราได้รับเทมเพลตแอปพลิเคชันสำเร็จรูปซึ่งมีการตั้งค่าทั้งหมดสำหรับการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์ เพื่อสร้างความประทับใจแรก เรามาสร้างคลาสคอนโทรลเลอร์กันดีกว่า (เราทุกคนคงเคยได้ยินเกี่ยวกับ MVC มาก่อน) ในแอปพลิเคชัน Spring ทั้งหมด คอนโทรลเลอร์มีการออกแบบที่ค่อนข้างเรียบง่าย - นี่คือคลาสที่ทำเครื่องหมายด้วยคำอธิบายประกอบ @Controller (สามารถใช้คำนำหน้าได้ เช่น @RestController) คลาสนี้รับผิดชอบในการประมวลผลคำขอที่เข้ามา เพื่อให้ผู้ควบคุมจดจำคำขอที่อยู่บางแห่งได้ คุณจะต้องแมปที่อยู่นี้กับวิธีการควบคุม 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 + "!"; } } เรามาดูกันว่าเกิดอะไรขึ้นที่นี่ @RestController _ คำอธิบายประกอบที่ฉันเขียนไว้ข้างต้นอย่างแน่นอน เราใช้ตัวควบคุมส่วนที่เหลือเพราะเราต้องการเห็นผลลัพธ์ทันทีและไม่ต้องการเขียนหน้า .jsp (ว้าว) มันจะง่ายกว่าสำหรับเราที่จะเห็นผลลัพธ์ในเบราว์เซอร์ทันทีในรูปแบบสตริง @RequestMappingเป็นเพียงการเชื่อมโยงกับที่อยู่ คำนำหน้าที่อยู่สาธารณะจะเป็น: localhost:8080 ดังที่เราเห็น ทั้งคลาสค้างอยู่ที่ที่อยู่ /helloซึ่งหมายความว่าเมธอดทั้งหมดภายในคลาสนี้จะมีคำนำหน้า localhost:8080/hello ถัดไปเป็นวิธีแรกของคลาสในการแมปของตัวเองระบุวิธีโปรโตคอล Http - คำขอ GET (อ่านเกี่ยวกับวิธีการโปรโตคอล Http ด้วยตัวคุณเอง) ทั้งหมดนี้หมายความว่าอย่างไร ด้วยการส่งคำขอ GET ไปยังที่อยู่ localhost:8080/hello เราจะได้รับคำตอบในรูปแบบของสตริง “Hello World!” มาตรวจสอบกัน! ในคลาส DemoApplication มีคำอธิบายประกอบที่ยอดเยี่ยมอย่างหนึ่งที่สามารถพูดได้ว่าเป็นการเรียกใช้บริบท Spring ทั้งหมดโดยลำพัง - @SpringBootApplication เมธอดหลักของคลาสนี้กลายเป็นเวทย์มนตร์ มันแค่เปิดตัวเวทย์มนตร์ทั้งหมดที่ซ่อนอยู่ใน SpringApplication หากคุณเรียกเมนูบริบทในคลาสนี้ ตัวเลือกจะปรากฏในบรรทัด Run ฉันแนะนำให้รันตั้งแต่เนิ่นๆ โดยมีเครื่องหมายสีเขียว ด้วยวิธีนี้ คอนโซลจะดูดีขึ้นและในอนาคตการอ่านบันทึกโดยตรงจากเธอจะง่ายกว่า มาเปิดแอปพลิเคชั่นกันเถอะ เมื่อเอาต์พุตคอนโซลหยุด คุณควรเห็นในคอนโซล
02-09-2558 09:25:36.895 ข้อมูล 5844 --- [ main] sbcetTomcatEmbeddedServletContainer : Tomcat เริ่มต้นบนพอร์ต: 8080 (http) 2015-09-02 09:25:36.900 INFO 5844 --- [ main] demo.DemoApplication : เริ่ม DemoApplication ใน **** วินาที (JVM ทำงานเป็นเวลา 15.501)
โดยที่ "****" คือระยะเวลาของการเปิดตัวแอปพลิเคชัน :) หลังจากนั้นในเบราว์เซอร์ใด ๆ (หรือ curl หรืออะไรก็ตามที่คุณใช้) คุณต้องพิมพ์ที่อยู่ที่มีการแมปวิธีการควบคุม
localhost:8080/สวัสดี
เบราว์เซอร์ควรแสดงรูปแบบบัญญัติ
สวัสดีชาวโลก!
นี่คือเว็บแอปพลิเคชันสำหรับคุณ! หากคุณสังเกตเห็นว่ามีวิธีการอื่นในคอนโทรลเลอร์ ก็แสดงว่ามีวิธีการจับคู่ที่อยู่ของตัวเอง โดยจะมีการเพิ่มตัวยึดตำแหน่งลงในที่อยู่ปัจจุบัน ซึ่งถูกส่งผ่านไปยังเมธอดเป็นพารามิเตอร์โดย Spring เดาได้ไม่ยากว่าคำอธิบายประกอบ @PathVariable เป็นผู้รับผิดชอบในเรื่องนี้ ดังนั้นตามคำขอ
localhost:8080/สวัสดี/ชื่อของคุณ
เบราว์เซอร์จะแสดง
สวัสดีคุณชื่อ!
เราได้แยกแยะพื้นฐานของ Spring Boot แล้ว ต่อไปเราจะแนบฐานข้อมูล แต่จะอยู่ในโพสต์ถัดไป ขอบคุณทุกคน.
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION