JSON-RPC API Library Library

عندما توصلت لأول مرة إلى كتابة اختبارات لجهاز microservice تم تطبيق واجهة برمجة التطبيقات الخاصة به وفقًا لبروتوكول JSON-RPC ، أدركت أن بناء اختبارات الجودة لعناصر json هو أكثر طلبًا مما كنت أعتقد من قبل.

ما يلي هو مثال بسيط.

تم تلقي رد من الخدمة:

{ "result": 12, "id": 46929734, "jsonrpc": "2.0" } 

ما تحتاج إلى التحقق:

  1. تحتوي الاستجابة على عنصر jsonrpc وقيمته 2.0
  2. تحتوي الاستجابة على عنصر معرف وقيمته مساوية لعنصر مماثل تم تمريره في الطلب ، في الوقت الحالي لنفترض أنه 46929734

تحتوي الإجابة على العنصر "النتيجة" وقيمته 12


كيفية التحقق من ذلك باستخدام Java + TestNG + Gson:

 Assert.assertTrue(response.has("result")); Assert.assertTrue(response.has("jsonrpc")); Assert.assertTrue(response.has("id")); Assert.assertTrue(response.get("result").isJsonPrimitive()); Assert.assertTrue(response.get("jsonrpc").isJsonPrimitive()); Assert.assertTrue(response.get("id").isJsonPrimitive()); Assert.assertEquals(response.get("result").getAsInt(), 12); Assert.assertEquals(response.get("jsonrpc").getAsString(), "2.0"); Assert.assertEquals(response.get("id").getAsInt(), 46929734); 

في هذه اللحظة ، قد يبدأ السؤال "لماذا توجد تأكيدات كثيرة؟" نعم ، في الواقع ، عند الاختبار ، أنت مهتم فقط بمجموعة التأكيدات الثلاثة الأخيرة ، فهي تتحقق من قيم json للعناصر الموجودة في الاستجابة وإذا نجحت ، فإن الإجابة تلبي التوقعات. ولكن ، ماذا لو فشل الاختبار؟ النظر في عدة أسباب محتملة لسقوط مثل هذا الاختبار:

  1. الجواب ->
     { "result": 12, "id": 46929734, "jsonrpc": "1.0" } 

    خطأ من TestNG -> java.lang.AssertionError: متوقع [2.0] ولكنه وجد [1.0]
    لقد انتظروا "2.0" ، وحصلوا على "1.0" - كل شيء واضح هنا.
  2. الجواب ->
     { "result": 12, "id": 46929734, "jsonrpc": {} } 

    خطأ من TestNG -> java.lang.UnsupportedOperationException: JsonObject

    حاولوا تحليل عنصر كسلسلة ، والذي تم استلامه بشكل غير متوقع على الإطلاق في الاستجابة ككائن.
  3. الجواب ->

     { "result": 12, "id": 46929734 } 

    خطأ من TestNG -> java.lang.NullPointerException
    حاولنا تحليل عنصر غير موجود في الإجابة كسلسلة.

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

مثل هذا العدد من عمليات التحقق ، والحاجة إلى كتابتها ودعمها في حالة محدّثة ، جعلني غاضبًا للغاية ، لذا قمت بإنشاء مكتبة منفصلة جمعت فيها جميع عمليات الفحص الضرورية ، في رأيي ، لعناصر json. يتم تحقيق نفس المستوى من التغطية والتفاصيل التي تتطلب json أعلاه باستخدام المكتبة في ثلاثة أسطر ، بدلاً من تسعة.

 Gassert.verifyInteger(response, "result", 12); Gassert.verifyString(response, "jsonrpc", "2.0"); Gassert.verifyInteger(response, "id", 46929734); 

تطبق المكتبة طرق الفحص:

  • عناصر من جميع الأنواع البدائية ، متداخلة وليس ، مع التحقق من القيمة وبدون
  • JsonObject ، متداخلة وليس ، مع التحقق من القيمة وبدون
  • JsonArray ، متداخلة وليس ، مع وبدون التحقق من القيمة
  • عناصر JsonNull متداخلة ولا
  • أنواع العناصر داخل مجموعة
  • محتويات صفيف العنصر المتوقع
  • أبعاد مجموعة
  • أبعاد الكائن

في جميع مستويات التحقق ، يتم تنفيذ أخطاء أكثر تفصيلًا بالنسبة لتلك التي يوفرها TestNG افتراضيًا.

النظر مرة أخرى في الأسباب المحتملة لسقوط الاختبار:

  1. الجواب ->
     { "result": 12, "id": 46929734, "jsonrpc": "1.0" } 

    خطأ من Gassert -> java.lang.AssertionError: فشل التحقق من العنصر [jsonrpc]. متوقع [2.0] ولكنه وجد [1.0]
  2. الجواب ->

     { "result": 12, "id": 46929734, "jsonrpc": {} } 

    خطأ من Gassert -> java.lang.AssertionError: العنصر [jsonrpc] ليس JsonPrimitive. لم تتوقع العثور على [صواب] ولكن وجدت [خطأ]
  3. الجواب ->

     { "result": 12, "id": 46929734 } 

    خطأ من Gassert -> java.lang.AssertionError: Json لا يحتوي على عنصر: [jsonrpc]. لم تتوقع العثور على [صواب] ولكن وجدت [خطأ]

بالإضافة إلى ذلك ، فإن معظم طرق الفحص يتم تحميلها بمعلمة سلسلة إضافية ، والتي في حالة حدوث خطأ في التأكيد سيتم إضافتها إلى نص الخطأ المعروض. يمكن استخدام هذه الميزة ، على سبيل المثال ، لعرض النص الكامل للرد أو طلب + استجابة عن طريق الخطأ.

المكتبة في مستودع جيثب العام ، وتضاف أيضا إلى مستودع المخضرم.

مخضرم
جيثب
APIDocs

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


All Articles