إذا كنت تريد أن تكون مريحًا للغاية للاختبار ضد واجهات برمجة التطبيقات ودمجها في CI للتحقق من كل التزام ، فإن IT المدرجة في SPRING BOOT هي بالتأكيد الخيار الأفضل.
اكتب حالة اختبار بسرعة
Runwith (SpringRunner.Class) springBoottest (WebEnvironment = SpringBoottest.webenvironment.random_port) ActiveProfiles ({perfile.env_it}) demoingrationtest {autowired private fooservice ؛ test public void test () {system.out.println ("tested") ؛ }}من بينها ، يحدد SpringBoottest بعض التكوينات عند تشغيلها. يستخدم الرمز أعلاه منافذ عشوائية ، وبالطبع يمكنه أيضًا تحديد المنافذ المحددة مسبقًا ، مثل هذا
springBoottest (WebEnvironment = SpringBoottest.webenvironment.defined_port ، خصائص = {"server.port = 9990"})يجبر ActiveProfiles استخدام ملف تعريف تكنولوجيا المعلومات. من أفضل الممارسات ، يجب عزل عناوين قواعد البيانات أو مكونات الموارد الأخرى التي تم تكوينها بواسطة ملف تعريف تكنولوجيا المعلومات من بيئة التطوير أو التدريج. لأنه عندما يتم تشغيله عبر العديد من المواقف ، نحتاج إلى مسح بيانات الاختبار.
يمكنك أن تجد أن مثل هذه الحالة يمكن حقنها باستخدام أي خدمة مرغوبة. وذلك لأن Spring يقوم بتحميل السياق بأكمله ، وهو نفس بيئة التشغيل الفعلية ، بما في ذلك قاعدة البيانات وذاكرة التخزين المؤقت والمكونات الأخرى. إذا كنت تشعر أنك لا تحتاج إلى جميع الموارد أثناء الاختبار ، فيمكنك حذف التكوين المقابل في الملف الشخصي. هذه بيئة تشغيل كاملة ، والفرق الوحيد هو أنه سيتم إيقاف تشغيله تلقائيًا بعد اكتمال حالة الاستخدام.
اختبر واجهة برمجة تطبيقات REST
نوصي بشدة بمكتبة لإضافتها إلى Gradle
testcompile 'io.rest-assured: rest-assured: 3.0.3'
دعم jsonpath ، وهو مفيد للغاية. انقر هنا للحصول على مستندات محددة
sql (scripts = "/testdata/users.sql")@testpublic void test001login () {String username =" [email protected] "؛ سلسلة كلمة مرور = "Demo" ؛ طلب jwtauthenticationRequest = new jwtauthenticationRequest (اسم المستخدم ، كلمة المرور) ؛ استجابة الاستجابة = give (). contentType (contentType.json) .body (request). when (). post ("/up/login"). ثم () .statuscode (httpstatus.ok.value () AssertThat (Response.path ("Token") ، هو (isnull.notnullvalue ())) ؛ AssertThat (Response.path ("Expirtive") ، IS (isnull.notnullvalue ())) ؛} يتم استخدام SQL لتنفيذ بيانات اختبار الإدراج SQL قبل الاختبار. لاحظ أنه يتم تمرير given().body() بالطبع ، يمكنك أيضًا وضع JSON المحول في الجسم ، والتأثير هو نفسه.
يتم اكتشاف نتيجة الإرجاع من خلال استجابة ، ثم يمكن الحصول على البيانات باستخدام JSONPATH للتحقق. بالطبع هناك طريقة أخرى أكثر سهولة ، والتي يمكن أن تحصل على الاستجابة الكاملة من خلال الاستجابة. asstring () ثم تخلص منه في كائن Java للتحقق.
في هذه المرحلة ، تم الانتهاء من ذلك. يمكن لإضافة اختبار Gradle إلى Jenkins تحقيق الاختبار في كل مرة يتم فيها تقديم الرمز.
بعض المواقف المعقدة
بيانات مختلطة
هذا هو الأسهل في الحدوث. يحتوي المشروع على العديد من Devs ، وسيقوم كل Dev بكتابة حالة تكنولوجيا المعلومات الخاصة به ، فماذا لو كان هناك تأثير بين البيانات. من السهل الفهم. على سبيل المثال ، في السيناريو الذي تكتب فيه دفعة اختبار ، تتمثل طريقة التحقق النهائية في معرفة ما إذا كانت كمية البيانات المكتوبة هي 10،000 سطر. ثم كتب Dev آخر حالات أخرى وحدث لإضافة بيانات جديدة إلى هذا الجدول ، والتي تحولت إلى صفوف 10W+1 ، وبالتالي فإن القضية المكتوبة على دفعات لن تتمكن من الفرار.
لمنع هذا الموقف ، نستخدم كل فئة اختبار لمسح البيانات. نظرًا لأنها عملية قائمة على الفصل ، يمكنك كتابة فصل أساسي لحلها.
Runwith (SpringRunner.class) springBoottest (WebEnvironment = SpringBoottest.WebenVironment.random_port) ActiveProfiles ({perfile.env_it}) public class passintegrationtest {private static jdbctemplate jdbctemplate ؛ @autowired public void setDataSource (dataSource dataSource) {jdbctemplate = new jdbctemplate (dataSource) ؛ } value ("$ {local.server.port}") port port المحمية ؛ before public void setupenv () {restassured.port = port ؛ RESTASSARD.BASEPATH = "/API" ؛ refrassured.baseuri = "http: // localhost" ؛ refrassured.config = restassured.config (). } public void teardownv () {live (). contentType (contentType.json). } apterClass public static void cleandb () يلقي sqlexception {resource Resource = new ClassPathResource ("/testData/cleandb.sql") ؛ اتصال الاتصال = jdbctemplate.getDataSource (). getConnection () ؛ scriptUtils.executesqlscript (اتصال ، مورد) ؛ connection.close () ؛ }}يستخدم AfterClass JDBCtemplate لتنفيذ cleandb.sql ، والذي يمسح جميع بيانات الاختبار بهذه الطريقة.
@ Value("${local.server.port}") يجب ذكرها أيضًا ، لأن المنفذ عشوائي ، لا يعرف الراحة أي المنفذ الذي يتم إرسال الطلب إليه. هنا ، استخدم Value للحصول على رقم المنفذ الحالي وتعيينه على إعادة صياغة. قم بحل هذه المشكلة.
كيفية معالجة البيانات المشتركة
تشغيل كامل قد يتطلب عشرات الفصول ومئات الطرق. فماذا لو كانت بعض البيانات مطلوبة لجميع الحالات وتحتاج إلى مسحها فقط بعد تشغيل جميع الحالات؟ بمعنى آخر ، لا يعتمد هذا النوع من تنظيف البيانات على الفصل ، ولكن في وقت واحد. على سبيل المثال ، بيانات المستخدم الأولية ، مكتبة المدينة ، إلخ.
لعبنا خدعة ذكية واستخدمنا طريق الطيران
@configuration@instelonalonclass ({datasource.class}) الفئة العامة regradeautoConfiguration {public static Final Flyway = "Flyway" ؛ bean (name = flyway) profile ({env_it}) public regradeservice cleanandupgradeservice (dataSource dataSource) {regradeservice upgradeservice = new Flywayupgradeservice (dataSource) ؛ حاول {regradeservice.clenandupgrade () ؛ } catch (استثناء ex) {logger.error ("فشل flyway!" ، ex) ؛ } إعادة الترقيات ؛ }} يمكنك أن ترى أنه عندما يكون ملف التعريف هو ذلك ، فإن Flyway سوف تسقط جميع الجداول وتنفيذ البرنامج النصي للترقية بدوره ، وبالتالي إنشاء جدول بيانات كامل ، وهو بالطبع فارغ. في مسار اختبار المشروع ، أضف إصدارًا ضخمًا من SQL ، بحيث يمكن لـ Flyway إدراج بيانات الاختبار الشائعة في النهاية ، مثل src/test/resources/db/migration/V999.0.1__Insert_Users.sql ، حل مشاكل البيانات المختلفة تمامًا.
ملخص
يمكن أن يؤدي استخدام خدمة الاختبار المدمجة في SPRING BOOT إلى التحقق بسرعة من واجهة برمجة التطبيقات. لا يتعين علي بدء الخدمة ثم النقر على الصفحة اليدوية لاختبار واجهة برمجة التطبيقات الخاصة بي. أتواصل مباشرة مع زملائي في الواجهة الأمامية بتنسيق الطلب وكتابة حالة للتحقق منها.
بالطبع ، هناك أيضًا عيب في هذه الطريقة ، وهو أنه من غير المريح اختبار النظام. في السابق ، كتب JMeter حالات اختبار API للشركة ، والتي ستكون أكثر ملاءمة عند إجراء اختبارات الأداء.