مضمونة REST: نصائح مفيدة

في هذه المقالة ، جمعت بعض النصائح المفيدة حول استخدام REST-Assured ، إحدى مكتبات Java الأكثر شيوعًا لأتمتة اختبار REST-API.

جميع الأمثلة حيوية ، وقد تم جمعها من ممارستي لإجراء مراجعة الكود في أكثر من 50 مشروعًا باستخدام الاختبارات الذاتية.

خذ نقاط النهاية إلى مكان منفصل


يبدو أن هذا واضح. ولكن لا ، في كثير من الأحيان يجب أن ترى رمزًا يحتوي على نقاط نهاية مشفرة في الطلب.

من الأفضل وضع نقاط النهاية في الثوابت الثابتة للطبقة النهائية. في الوقت نفسه ، يجب تجنب "الواجهة الثابتة" المضادة للطالب - وهذه ممارسة سيئة.

لا تنس أن REST-Assured يسمح لك بعمل معلمات المسار ، على سبيل المثال:

public final class EndPoints { public static final String users = "/users/{id}"; ... } given().pathParams("id", someId).get(EndPoints.users)...; //   given().get(EndPoints.users, someId).... 

أيضًا ، إذا كنت تستخدم العديد من الاستعلامات في نفس المسار الأساسي ، فسيكون من الأفضل وضعه في ثابت الفندق وتمريره إلى basePath ، على سبيل المثال:

 //   url  http://host:port/appname/rest/someEndpoints private static final basePath = "/appname/rest/"; .. //       , //      : RestAssured.basePath = basePath; //     : given().basePath(basePath)... //    ,     

الأمر نفسه ينطبق على مضيف ومنفذ التطبيق قيد الاختبار.

نوع المحتوى / قبول


يتم استخدام هذه الرؤوس في جميع طلبات HTTP تقريبًا. أدرك المؤلفون المؤكدون لـ REST ، بعد أن أدركوا ذلك ، إمكانية تثبيتها عن طريق استدعاء طرق خاصة:

 //   : given().header("content-type", "application/json").header("accept", "application/json")...; //   : given().contentType(ContentType.JSON).accept(ContentType.JSON)...; 

من الممارسات الجيدة تعيين هذه الرؤوس في مواصفة أو بشكل عام. سيؤدي ذلك إلى زيادة إمكانية قراءة التعليمات البرمجية الخاصة بك.

رمز الحالة ، إلخ.


يوفر ضمان REST بناء جملة مناسبًا للتحقق من كل مكون من مكونات استجابة HTTP ، ولكن في الممارسة العملية ، لا تزال تواجه رمزًا مشابهًا:

 //   : Response response = given()...when().get(someEndpoint); Assert.assertEquals(200, response.then().extract().statusCode()); //   : given()...when().get(someEndpoint).then().statusCode(200); 

استخدم المواصفات


ازدواجية الرمز سيئة. استخدم المواصفات لتقليل الازدواجية. في REST- المضمون ، يمكنك إنشاء مواصفات لكل من الطلب والاستجابة. في تحديد الطلب نطرح كل ما يمكن تكراره في الطلبات.

 RequestSpecification requestSpec = new RequestSpecBuilder() .setBaseUri("http://localhost") .setPort(8080) .setAccept(ContentType.JSON) .setContentType(ContentType.ANY) ... .log(LogDetail.ALL) .build(); //       : RestAssured.requestSpecification = requestSpec; //   : given().spec(requestSpec)...when().get(someEndpoint); 

في تحديد الرد نقوم بكل الشيكات المكررة من طلب إلى طلب.

 ResponseSpecification responseSpec = new ResponseSpecBuilder() .expectStatusCode(200) .expectBody(containsString("success")) .build(); //       : RestAssured.responseSpecification = responseSpec; //   : given()...when().get(someEndpoint).then().spec(responseSpec)...; 

يمكنك إنشاء العديد من المواصفات لأنواع مختلفة من الطلبات / الردود واستخدامها في الوضع الصحيح.

لا تكتب العكازات لتحويل الأشياء


لا يجب تحويل POJOs إلى JSON باستخدام Jackson ObjectMapper ، ثم نقل السلسلة الناتجة إلى نص الطلب. وأكد REST- المؤكد القيام بعمل عظيم من هذا. لهذا ، يتم استخدام نفس جاكسون أو غسون ، اعتمادًا على ما هو موجود في مسار الفصل الدراسي. يستخدم JAXB للتحويل إلى XML. يتم تحديد التنسيق الأصلي تلقائيًا بقيمة نوع المحتوى.

 given().contentType(ContentType.JSON).body(somePojo) .when().post(EndPoints.add) .then() .statusCode(201); //        : SomePojo pojo = given(). .when().get(EndPoints.get) .then().extract().body().as(SomePojo.class); 

بالإضافة إلى ذلك ، يقوم REST-Assured بعمل رائع في تحويل HashMap إلى JSON والعكس صحيح.

تسخير قوة Groovy


تمت كتابة مكتبة REST المؤكدة نفسها في Groovy وتسمح لك بتطبيق طرق مختلفة من Groovy إلى استجابة JSON / XML المستلمة. على سبيل المثال:

 //  find, findAll         ,  collect       . //  it         Map<String, ?> map = get(EndPoints.anyendpoint).path("rootelement.find { it.title =~ 'anythingRegExp'}"); //     ,     Map<String, ?> map = get(EndPoints.anyendpoint).path("rootelement.findAll { element -> element.title.length() > 4 }"); //     sum, max, min     ,        String expensiveCar = get(EndPoints.cars).path("cars.find { it.title == 'Toyota Motor Corporation'}.models.max { it.averagePrice }.title"); 

يمكن أن يقلل استخدام الأساليب من Groovy بشكل كبير من حجم الرمز الذي تكتبه للعثور على القيمة المطلوبة من الإجابة.

هذا كل شيء ، إذا كان لديك المزيد من النصائح والأمثلة ، فاكتبها في التعليقات.

Source: https://habr.com/ru/post/ar421005/


All Articles