หากคุณต้องการที่จะสะดวกมากสำหรับการทดสอบ API และรวมเข้ากับ CI เพื่อตรวจสอบการกระทำแต่ละครั้งแล้วมันรวมอยู่ใน Spring Boot เป็นตัวเลือกที่ดีที่สุดอย่างแน่นอน
เขียนกรณีทดสอบอย่างรวดเร็ว
@runwith (springrunner.class) @springboottest (webenvironment = springboottest.webenvironment.random_port) @ActiveProfiles ({profiles.env_it}) ชั้นเรียนสาธารณะ demointegrationTest @Test Public Void Test () {System.out.println ("ทดสอบ"); -ในหมู่พวกเขา Springboottest กำหนดการกำหนดค่าบางอย่างเมื่อเรียกใช้ รหัสด้านบนใช้พอร์ตสุ่มและแน่นอนว่ายังสามารถกำหนดพอร์ตที่กำหนดไว้ล่วงหน้าเช่นนี้
@SpringBoottest (WebEnvironment = SpringBootTest.webenvironment.defined_port, Properties = {"Server.port = 9990"})ActiveProfiles บังคับให้ใช้โปรไฟล์ไอที จากแนวปฏิบัติที่ดีที่สุดที่อยู่ของฐานข้อมูลหรือส่วนประกอบทรัพยากรอื่น ๆ ที่กำหนดค่าโดยโปรไฟล์ไอทีควรถูกแยกออกจากสภาพแวดล้อมการพัฒนาหรือการจัดเตรียม เพราะเมื่อมันทำงานผ่านหลายสถานการณ์เราจึงต้องล้างข้อมูลการทดสอบ
คุณสามารถพบได้ว่ากรณีดังกล่าวสามารถฉีดได้โดยอัตโนมัติในบริการที่ต้องการ นี่เป็นเพราะสปริงโหลดบริบททั้งหมดซึ่งเหมือนกับสภาพแวดล้อมที่ใช้งานจริงรวมถึงฐานข้อมูลแคชและส่วนประกอบอื่น ๆ หากคุณรู้สึกว่าคุณไม่ต้องการทรัพยากรทั้งหมดในระหว่างการทดสอบคุณสามารถลบการกำหนดค่าที่สอดคล้องกันในโปรไฟล์ นี่เป็นสภาพแวดล้อมการดำเนินงานที่สมบูรณ์ความแตกต่างเพียงอย่างเดียวคือมันจะปิดโดยอัตโนมัติหลังจากกรณีการใช้งานเสร็จสมบูรณ์
ทดสอบ REST API
ขอแนะนำห้องสมุดเพื่อเพิ่มลงใน Gradle
TestCompile 'IO.rest ได้รับการรับรอง: REST-erast: 3.0.3'
สนับสนุน JsonPath ซึ่งมีประโยชน์มาก คลิกที่นี่สำหรับเอกสารเฉพาะ
@SQL (scripts = "/testdata/users.sql") @testpublic เป็นโมฆะ test001login () {string username =" [email protected] "; สตริงรหัสผ่าน = "สาธิต"; jwtauthenticationRequest Request = ใหม่ jwtauthenticationRequest (ชื่อผู้ใช้รหัสผ่าน); การตอบสนองการตอบสนอง = ให้ (). contentType (contentType.json) .body (คำขอ). เมื่อ (). โพสต์ ("/auth/login"). จากนั้น () .statuscode (httpstatus.ok.value (). extract () assertThat (response.path ("โทเค็น"), คือ (isnull.notnullValue ())); assertThat (response.Path ("หมดอายุ"), IS (isnull.notnullValue ()));} @SQL ใช้เพื่อดำเนินการทดสอบการแทรก SQL ก่อนการทดสอบ โปรดทราบว่า given().body() จะถูกส่งผ่านในวัตถุ Java jwtauthenticationRequest เนื่องจากที่ได้รับการรับรองจะช่วยให้คุณใช้แจ็คสันโดยอัตโนมัติในการทำให้เป็นอนุกรมวัตถุในสตริง JSON แน่นอนว่าคุณสามารถใส่ JSON ที่แปลงแล้วลงในร่างกายผลก็เหมือนกัน
ผลการส่งคืนจะถูกจับโดยการตอบกลับจากนั้นข้อมูลสามารถรับได้โดยใช้ JSONPath สำหรับการตรวจสอบ แน่นอนว่ามีวิธีที่ใช้งานง่ายอีกอย่างหนึ่งซึ่งสามารถรับการตอบสนองที่สมบูรณ์ผ่านการตอบสนอง asstring () จากนั้น deserialize มันลงในวัตถุ Java สำหรับการตรวจสอบ
ณ จุดนี้พื้นฐานที่สุดเสร็จแล้ว การเพิ่มการทดสอบขั้นตอนการศึกษาไปยังเจนกินส์สามารถทดสอบได้ทุกครั้งที่ส่งรหัส
สถานการณ์ที่ซับซ้อนบางอย่าง
ข้อมูลผสม
นี่เป็นวิธีที่ง่ายที่สุดที่จะเกิดขึ้น โครงการมี devs จำนวนมากและแต่ละ dev จะเขียนกรณีไอทีของตัวเองดังนั้นถ้ามีผลกระทบระหว่างข้อมูล เข้าใจง่าย ตัวอย่างเช่นในสถานการณ์ที่ชุดทดสอบเขียนวิธีการตรวจสอบขั้นสุดท้ายคือการดูว่าจำนวนข้อมูลที่เขียนคือ 10,000 บรรทัดหรือไม่ จากนั้น dev อีกคนเขียนกรณีอื่น ๆ และเกิดขึ้นเพื่อเพิ่มข้อมูลใหม่ลงในตารางนี้ซึ่งเปลี่ยนเป็นแถว 10W+1 ดังนั้นกรณีที่เขียนด้วยแบทช์จะไม่สามารถหลบหนีได้
เพื่อป้องกันสถานการณ์นี้เราใช้แต่ละคลาสทดสอบเพื่อล้างข้อมูล เนื่องจากเป็นการดำเนินการตามคลาสคุณจึงสามารถเขียนคลาสฐานเพื่อแก้ไขได้
@runwith (springrunner.class) @springboottest (webenvironment = springboottest.webenvironment.random_port) @ActiveProfiles ({profiles.env_it}) ระดับนามธรรมสาธารณะ @AutoWired โมฆะสาธารณะ setDataSource (DataSource DataSource) {JDBCTEMPLATE = JDBCTEMPLATE ใหม่ (DataSource); } @Value ("$ {local.server.port}") พอร์ต int ป้องกัน; @Before โมฆะสาธารณะ setupEnv () {restassured.port = พอร์ต; Ratassured.basepath = "/api"; Ratassured.baseuri = "http: // localhost"; rentassured.config = restassured.config (). httpClient (httpClientConfig.httpClientConfig (). httpmultipartmode (httpmultipartmode.browser_compatible); } โมฆะสาธารณะ teardownenv () {ให้ (). contentType (contentType.json). เมื่อ (). โพสต์ ("/auth/logout"); } @afterClass เป็นโมฆะคงที่สาธารณะ cleanDB () พ่น sqlexception {ทรัพยากรทรัพยากร = ใหม่ classPathResource ("/testData/cleandb.sql"); การเชื่อมต่อการเชื่อมต่อ = jdbctemplate.getDataSource (). getConnection (); scriptUtils.executeqlscript (การเชื่อมต่อ, ทรัพยากร); Connection.close (); -@AfterClass ใช้ JDBCTEMPLATE เพื่อดำเนินการ CleanDB.SQL ซึ่งล้างข้อมูลการทดสอบทั้งหมดด้วยวิธีนี้
@ Value("${local.server.port}") ยังต้องมีการกล่าวถึงด้วยเนื่องจากพอร์ตนั้นสุ่ม, REST-rest-rest-rester ไม่ทราบว่าพอร์ตใดที่ส่งคำขอถูกส่งไป ที่นี่ใช้ @Value เพื่อรับหมายเลขพอร์ตปัจจุบันและตั้งค่าเป็นร้านอาหารพอร์ตเพื่อแก้ปัญหานี้
วิธีประมวลผลข้อมูลที่ใช้ร่วมกัน
การทำงานให้เสร็จสมบูรณ์อาจต้องใช้หลายสิบชั้นและวิธีการหลายร้อยวิธี ดังนั้นถ้าจำเป็นต้องมีข้อมูลบางอย่างสำหรับทุกกรณีและจำเป็นต้องล้างหลังจากดำเนินการทุกกรณีเท่านั้น กล่าวอีกนัยหนึ่งการทำความสะอาดข้อมูลประเภทนี้ไม่ได้ขึ้นอยู่กับชั้นเรียน แต่ในการวิ่งในครั้งเดียว ตัวอย่างเช่นข้อมูลผู้ใช้เริ่มต้นห้องสมุดเมือง ฯลฯ
เราเล่นเคล็ดลับที่ฉลาดและใช้ Flyway
@configuration@conditionalOnClass ({dataSource.class}) คลาสสาธารณะ UpgradeAutoconFiguration {สตริงสุดท้ายคงที่สาธารณะ flyway = "Flyway"; @Bean (name = Flyway) @Profile ({env_it}) การอัพเกรดสาธารณะ CleanandUpgradeservice (DataSource DataSource) {Upgradeservice Upgradeservice = New FlywayUpgradeservice (DataSource); ลอง {upgradeservice.cleanandupgrade (); } catch (exception ex) {logger.error ("Flyway ล้มเหลว!", Ex); } return upgradeservice; - คุณจะเห็นได้ว่าเมื่อโปรไฟล์เป็นมัน Flyway จะวางตารางทั้งหมดและเรียกใช้สคริปต์การอัพเกรดในทางกลับกันดังนั้นการสร้างตารางข้อมูลที่สมบูรณ์ซึ่งแน่นอนว่าว่างเปล่า ในเส้นทางทดสอบของโครงการเพิ่ม SQL รุ่นใหญ่เพื่อให้ Flyway สามารถแทรกข้อมูลการทดสอบทั่วไปในตอนท้ายเช่น src/test/resources/db/migration/V999.0.1__Insert_Users.sql แก้ปัญหาข้อมูลต่างๆอย่างสมบูรณ์
สรุป
การใช้บริการทดสอบในตัวใน Spring Boot สามารถตรวจสอบ API ได้อย่างรวดเร็ว ฉันไม่จำเป็นต้องเริ่มต้นบริการแล้วคลิกที่หน้าคู่มือเพื่อทดสอบ API ของฉัน ฉันสื่อสารโดยตรงกับเพื่อนร่วมงานส่วนหน้าของฉันรูปแบบคำขอและเขียนเคสเพื่อตรวจสอบ
แน่นอนว่ายังมีข้อเสียของวิธีนี้ซึ่งก็คือไม่สะดวกที่จะทดสอบความเครียดระบบ ก่อนหน้านี้กรณีทดสอบ API ของ บริษัท ถูกเขียนโดย JMeter ซึ่งจะสะดวกกว่ามากเมื่อทำการทดสอบประสิทธิภาพ