عند تصميم سير عمل الاختبارات الآلية في Apidog، ستستخدم أنواعًا مختلفة من خطوات الاختبار—مثل طلبات واجهة برمجة التطبيقات (API)، استعلامات قواعد البيانات، حلقة For، حلقة ForEach، البرامج النصية (Scripts)، والمزيد.

غالبًا ما تحتاج البيانات التي يتم إنتاجها في خطوة ما إلى استخدامها في خطوة لاحقة. وهذا يخلق تدفقًا منطقيًا حيث البيانات هي المحرك للعملية، والخطوات مترابطة.
على سبيل المثال، قد تقوم بما يلي:
- استرداد رمز مميز للمستخدم في خطوة سابقة، أو تشغيل استعلام قاعدة بيانات للحصول على سجل معين.
- ثم استخدام تلك النتائج في طلب نقطة نهاية (endpoint) في الخطوة التالية.
وهذا يثير سؤالاً هامًا:
كيف يمكنك الإشارة بشكل صحيح إلى البيانات من الخطوات السابقة (المنبع) في الخطوات اللاحقة (المصب)؟
آليتان لتمرير البيانات في Apidog
في الاختبارات الآلية لـ Apidog، توجد طريقتان رئيسيتان لتمرير البيانات بين خطوات الاختبار المختلفة:
1. استرداد بيانات الخطوة السابقة عبر "القيم الديناميكية" (Dynamic Values)
يمكنك الإشارة مباشرة إلى مخرجات خطوة سابقة (منبع) في خطوة لاحقة (مصب) باستخدام ميزة "القيمة الديناميكية". يتيح لك هذا جلب البيانات أثناء التنفيذ دون الحاجة لتخزينها.

2. تخزين المتغيرات وإعادة استخدامها
يمكنك استخلاص البيانات الهامة من خطوة سابقة (منبع) وتخزينها كمتغير. يمكن بعد ذلك إعادة استخدام هذه المتغيرات في أي خطوة لاحقة.

إتقان هاتين الطريقتين لتمرير البيانات هو المفتاح لبناء سير عمل آلي فعال ومدفوع بالبيانات في Apidog.
يشرح هذا المقال كيفية التعامل مع البيانات في أنواع مختلفة من خطوات الاختبار من زاويتين: كيفية استخلاص البيانات وكيفية استخدامها. بفهم كليهما، ستتمكن من بناء سير عمل اختبار أكثر مرونة وترابطًا.
استخلاص واستخدام بيانات استجابة نقطة النهاية (Endpoint)
فهم بيانات استجابة نقطة النهاية (Endpoint Response Data)
في الاختبارات الآلية، عادةً ما تُرجع طلبات واجهة برمجة التطبيقات (API) استجابات JSON منظمة، والتي غالبًا ما تكون بمثابة مدخلات لخطوات الاختبار اللاحقة.

على عكس أنواع الخطوات الأخرى، تميل استجابات نقاط النهاية إلى أن تكون أكثر تعقيدًا — حيث تتضمن غالبًا كائنات ومصفوفات متداخلة.
كيفية استخلاص البيانات من استجابة نقطة النهاية
هناك طريقتان رئيسيتان لاستخلاص وتمرير بيانات استجابة نقطة النهاية بين خطوات الاختبار:
الطريقة الأولى: الإشارة إلى القيمة الديناميكية (Dynamic Value Reference)
استخدم "القيم الديناميكية" للإشارة مباشرة إلى البيانات من الخطوات السابقة:
- في أي حقل إدخال لخطوة لاحقة (downstream)، انقر على أيقونة العصا السحرية.
- اختر "استرداد بيانات الخطوة السابقة" (Retrieve Pre-step Data)
- سيقوم Apidog تلقائيًا بإدراج التعبير الصحيح — لا حاجة لكتابته يدويًا.

الطريقة الثانية: استخلاص البيانات كمتغيرات
يمكنك أيضًا استخدام ميزة "استخلاص المتغيرات" (Extract Variables) في معالجات ما بعد نقطة النهاية (endpoint post processors) لاستخلاص حقول محددة من الاستجابة كمتغيرات.
على سبيل المثال، لاستخلاص id المنتجات في استجابة:
- عيّن اسم المتغير كـ
products_id - استخدم JSONPath:
$.products[0].id

في الخطوات اللاحقة، قم بالإشارة إليه ببساطة باستخدام {{products_id}}.
كيفية استخدام البيانات المستخلصة من استجابة نقطة النهاية
بمجرد استخلاص البيانات من استجابة واجهة برمجة التطبيقات (API)—سواء باستخدام "القيم الديناميكية" أو "المتغيرات المستخلصة"—يمكنك استخدام تلك البيانات في الخطوات اللاحقة بعدة طرق:
1. استخدام البيانات في طلبات نقطة النهاية (endpoint requests)
- عبر القيمة الديناميكية (Dynamic Value): تمامًا كما كان من قبل، انقر على أيقونة العصا السحرية في حقل الإدخال، اختر "استرداد بيانات الخطوة السابقة" (Retrieve Pre-step Data)، وسيُدرج Apidog التعبير الصحيح تلقائيًا.
- عبر المتغير المستخلص (Extracted Variable): إذا كنت قد حفظت قيمة سابقًا كمتغير (مثل
products_id)، فما عليك سوى استخدام{{products_id}}كمعامل في طلب واجهة برمجة التطبيقات (API).

2. استخدام البيانات في عمليات قاعدة البيانات
يمكنك استخدام استجابة واجهة برمجة التطبيقات (API) كمدخل في استعلام قاعدة بيانات. كلتا الطريقتين تعملان:
- طريقة القيمة الديناميكية (Dynamic Value Method)
SELECT * FROM products WHERE id = '{{$.1.response.body.products[0].id}}'
استخدم القيم الديناميكية للإشارة إلى بيانات استجابة واجهة برمجة التطبيقات مباشرة في استعلام SQL:

- طريقة المتغير المستخلص (Extracted Variable Method): إذا كنت قد استخلصت معرف المنتج كمتغير باسم
products_id، فاستخدم:
SELECT * FROM products WHERE id = '{{products_id}}'3. استخدام البيانات في حلقة For
لتكرار الخطوات بناءً على طول مصفوفة من استجابة واجهة برمجة التطبيقات (API):
- استخدم القيم الديناميكية للحصول على طول المصفوفة، على سبيل المثال:
{{$.1.response.body.products.length}}يحدد هذا عدد تكرارات الحلقة.

4. استخدام البيانات في حلقات ForEach
إذا كنت ترغب في التكرار عبر كل عنصر في مصفوفة تم إرجاعها بواسطة نقطة نهاية:
- طريقة القيمة الديناميكية (Dynamic Value Method): استخلص المصفوفة بأكملها مباشرة، على سبيل المثال
{{$.1.response.body.products}}

- طريقة استخلاص المتغير (Extract Variable Method): بافتراض أن المصفوفة بأكملها قد تم استخلاصها كمتغير
products، فقم بإدراج{{products}}مباشرة في الحلقة.

5. استخدام البيانات في البرامج النصية (scripts)
لاستخدام البيانات من الخطوات السابقة داخل برنامج نصي، استخدم طريقة pm.variables.get(). إليك كيفية ذلك:
- طريقة القيمة الديناميكية (Dynamic Value Method): اقرأ البيانات مباشرة من خطوة سابقة:
const products = pm.variables.get("$.1.response.body.products")
- طريقة استخلاص المتغير (Extract Variable Method): إذا قمت بحفظ المصفوفة أو القيمة كمتغير، فاستخدم السكربت التالي للحصول على البيانات:
احصل على قيمة متغير مؤقت:
const products = pm.variables.get("products") احصل على قيمة متغير بيئة:
const products = pm.environment.get("products")
احصل على قيمة متغير عام:
const products = pm.globals.get("products"){{products}} مباشرة. بدلاً من ذلك، يجب عليك استرداد قيم المتغيرات باستخدام الطرق المناسبة المذكورة أعلاه.استخلاص واستخدام نتائج استعلام قاعدة البيانات
فهم بيانات قاعدة البيانات
عند تنفيذ خطوة استعلام قاعدة بيانات، فإنها تُرجع بيانات منظمة على شكل مصفوفة من الكائنات. حتى لو تم إرجاع سجل واحد فقط، فسيظل مغلفًا في مصفوفة. على سبيل المثال:

على عكس استجابات نقاط النهاية، لا يمكن الوصول إلى البيانات من خطوات قاعدة البيانات مباشرة باستخدام المتغيرات الديناميكية. يجب عليك أولاً استخلاص القيم في متغيرات.
كيفية استخلاص البيانات من قاعدة البيانات
بعد تشغيل استعلام SQL في خطوة قاعدة بيانات، سيقوم Apidog تلقائيًا بتحليل الاستجابة إلى بيانات منظمة، مثل هذا:
[
{
"id": "1000",
"title": "Title 1",
"description": "Description for Title 1"
}
]
يمكنك بعد ذلك استخدام JSONPath لاستخلاص حقول محددة وحفظها كمتغيرات.
على سبيل المثال:
- اسم المتغير:
products_id - JSONPath:
$[0].id(لاستخلاص معرف العنصر الأول). إذا كنت ترغب في استخلاص مجموعة النتائج بأكملها، استخدم:$. - تشير الخطوات اللاحقة إلى المتغيرات من خلال
{{ }}، على سبيل المثال:{{products_id}}

كيفية استخدام البيانات المستخلصة من قاعدة البيانات
1. استخدام البيانات في طلبات نقطة النهاية (endpoint requests)
إذا كان استعلام قاعدة البيانات الخاص بك يُرجع معرفًا وقمت بحفظه كمتغير (products_id)، يمكنك استخدامه مباشرة في طلب نقطة نهاية لاحق:

2. استخدام البيانات في حلقات ForEach
إذا كان استعلامك يُرجع قائمة من السجلات، وترغب في معالجة كل سجل على حدة، يمكنك استخدام المصفوفة بأكملها كمصدر لحلقة ForEach:

الفرضية هي أنك تحفظ المصفوفة بأكملها عند استخلاص المتغيرات في عمليات قاعدة البيانات، على سبيل المثال:
- اسم المتغير:
products - JSONPath:
$

3. استخدام البيانات في البرامج النصية (scripts)
لاستخدام متغيرات قاعدة البيانات المستخلصة في برنامج نصي، استخدم نفس الطريقة كما هو الحال مع المتغيرات الأخرى.
احصل على قيمة متغير مؤقت:
const products = pm.variables.get("products")احصل على قيمة متغير بيئة:
const products = pm.environment.get("products")احصل على قيمة متغير عام:
const products = pm.globals.get("products")
استخلاص واستخدام البيانات من حلقات For
كيف تعمل حلقات For؟
تُستخدم حلقة For لتكرار مجموعة محددة من الإجراءات عدة مرات. تعمل بناءً على عدد محدد من التكرارات.
يمكنك إما تعيين عدد ثابت من مرات التكرار، أو استخدام قيمة ديناميكية مثل طول مصفوفة .length التي تم إرجاعها من خطوة سابقة. على سبيل المثال: {{$.1.response.body.products.length}}:

ملاحظة: على عكس الخطوات الأخرى التي تُخرج البيانات، فإن حلقة For نفسها لا تُرجع البيانات مباشرة. إنها توفر فقط قيمة فهرس (تبدأ من 0) لإظهار عدد مرات تنفيذ الحلقة.
كيفية استخلاص البيانات من حلقات For
أثناء عملية التنفيذ، يمكنك الوصول إلى فهرس الحلقة الحالي باستخدام صيغة المتغير الديناميكي: {{$.9.index}}

- يشير الرقم
9إلى معرف خطوةحلقات For. - لكل خطوة معرف فريد.
- يبدأ الفهرس من 0 للحلقة الأولى، 1 للثانية، وهكذا.
كيفية استخدام البيانات المستخلصة من حلقات For
1. استخدام البيانات في البرامج النصية (scripts)
إذا كنت ترغب في استخدام معلومات متعلقة بالحلقة في برنامج الاختبار النصي الخاص بك، يمكنك استخدام pm.variables.get() للحصول على الفهرس الحالي:
// Get the current loop index
const index = pm.variables.get("$.7.index");
2. استخدام البيانات مع مصادر بيانات أخرى
حالة استخدام شائعة لـ حلقة For هي معالجة البيانات من الخطوات السابقة—مثل التكرار عبر مصفوفة والتعامل مع كل عنصر:
// Get the array from a previous step
const products = pm.variables.get("$.1.response.body.products");
// Get the current loop index
const index = pm.variables.get("$.7.index");
// Access the current item in the array using the index
console.log(products[index]);
يتيح لك هذا إجراء عمليات مجمعة على كل عنصر في المصفوفة خلال كل تكرار للحلقة.
استخلاص واستخدام البيانات من حلقة ForEach
كيف تعمل حلقة ForEach؟
تم تصميم حلقة ForEach خصيصًا لبيانات المصفوفات. فهي تتكرر تلقائيًا عبر كل عنصر في المصفوفة وتنفذ نفس المجموعة من العمليات.
الفرق الرئيسي بين حلقة ForEach و حلقة For هو أن حلقة ForEach تستخلص تلقائيًا البيانات الكاملة لعنصر المصفوفة الحالي في كل تكرار، مما يجعلها قابلة للوصول مباشرة في خطواتها الفرعية.
الوصول إلى البيانات في حلقة ForEach
ضمن حلقة ForEach، يقوم النظام تلقائيًا بإنشاء متغيرين خاصين:
- عناصر الحلقة الحالية (Current loop elements): تحتوي على البيانات الكاملة لعنصر المصفوفة الذي تتم معالجته حاليًا. على سبيل المثال:
{{$.4.element}}. إذا كانت المصفوفة تحتوي على كائنات، يمكنك الوصول مباشرة إلى خصائصها، مثل:{{$.4.element.id}}،{{$.4.element.title}}، إلخ.

- فهرس الحلقة الحالي (Current loop index): يمثل عدد التكرارات الحالي (بدءًا من 0)، على سبيل المثال:
{{$.4.index}}.

ملاحظة: يشير الرقم 4 إلى معرف خطوة حلقة ForEach. في سير عملك الفعلي، استبدل هذا بمعرف الخطوة الصحيح من عمليتك.
حالات الاستخدام الشائعة لبيانات حلقة ForEach
1. استخدام البيانات في طلبات نقطة النهاية (endpoint requests)
تعتبر حلقات ForEach مثالية للتعامل مع عمليات البيانات المجمعة. على سبيل المثال، إذا كان لديك مصفوفة من العناصر، يمكنك إرسال طلب نقطة نهاية تلقائيًا لكل عنصر في المصفوفة. خلال كل حلقة، يتم إعادة استخدام نفس قالب الطلب، ولكن يتم ملؤه ببيانات مختلفة، مثل {{$.4.element.id}}.

2. استخدام البيانات في عمليات قاعدة البيانات
يمكنك استخدام البيانات من عنصر الحلقة الحالي لتشغيل استعلامات قاعدة البيانات أو إدراج صفوف متعددة.
مثال: استعلام قاعدة البيانات باستخدام حقل العنصر الحالي
SELECT * FROM products WHERE id = '{{$.4.element.id}}'
يمكن الوصول إلى التعبير {{$.4.element.id}} باستخدام ميزة القيمة الديناميكية.

إدراج حقول متعددة من العنصر الحالي في جدول:
INSERT INTO products (id, title) VALUES ('{{$.4.element.id}}', '{{$.4.element.title}}')
3. استخدام البيانات في البرامج النصية (scripts)
إذا كنت بحاجة إلى معالجة البيانات من الحلقة بشكل أكبر في برنامج نصي مخصص، يمكنك استخدام طريقة pm.variables.get() لاسترداد القيم:
// Get the current element
const item = pm.variables.get("$.4.element");
// Get the current index
const index = pm.variables.get("$.4.index");استخلاص واستخدام البيانات من البرامج النصية (Scripts)
كيف تعمل بيانات البرامج النصية (Script Data)
على عكس الخطوات الأخرى في سير العمل، لا تُنشئ البرامج النصية مخرجات تلقائيًا يمكن استخدامها مباشرة في الخطوات التالية. إذا كنت ترغب في تمرير البيانات من برنامج نصي إلى خطوات لاحقة، يجب عليك تخزينها يدويًا في متغير.
كيفية استخلاص البيانات من برنامج نصي
يمكنك حفظ القيم في أنواع مختلفة من المتغيرات هكذا:
// Get JSON response data
// 1. From the current endpoint response
// const currentData = pm.response.json();
// 2. Or get it from a previous step using a dynamic value
const preData = pm.variables.get("$.1.response.body");
// Save to environment variables
pm.environment.set('products', preData.products);
pm.environment.set('products_id', preData.products[0].id);
// Save to global variables
pm.globals.set('products', preData.products);
// Save to temporary variables (valid only during this run)
pm.variables.set('products', preData.products);بمجرد استخلاص المتغيرات وتعيينها، يمكنك الإشارة إليها في الخطوات اللاحقة باستخدام الصيغة {{variableName}}.
كيفية استخدام البيانات المستخلصة من البرامج النصية (Scripts)
1. استخدام البيانات في طلبات نقطة النهاية (endpoint requests)
يمكن استخدام المتغيرات المعينة في برنامج نصي مباشرة كمعاملات في طلبات نقطة النهاية اللاحقة. على سبيل المثال، إذا قمت بحفظ products_id في البرنامج النصي، يمكنك الإشارة إليه في طلب لاحق هكذا: {{products_id}}.

2. استخدام البيانات في عمليات قاعدة البيانات
يمكن أيضًا استخدام متغيرات البرنامج النصي لبناء عبارات SQL ديناميكية. على سبيل المثال:
SELECT * FROM products WHERE id = '{{products_id}}'3. استخدام البيانات في حلقة For
يمكنك استخدام برنامج نصي لإنشاء عدد التكرارات أو القيم الوسيطة الأخرى، وتخزينها كـ "متغيرات مؤقتة"، وتمريرها إلى خطوة حلقة For:
pm.variables.set("loopCount", 5); ثم، في إعدادات الحلقة، استخدم {{loopCount}} كعدد التكرارات.
4. استخدام البيانات في حلقات ForEach
يمكنك تخزين مصفوفة كاملة في متغير واستخدامها كمصدر بيانات لـ حلقة ForEach.
مثال:
// Optionally retrieve array from a previous step using dynamic values
// const preData = pm.variables.get("$.1.response.body.products")
const preData = [{id: 1}, {id: 2}, {id: 3}];
// Save to environment variable
pm.environment.set('products', preData);
ثم في حلقة ForEach، عيّن مصدر البيانات إلى {{products}}.
الخلاصة
لبناء سير عمل اختبار آلي فعال، من الضروري فهم كيفية استخلاص واستخدام البيانات من أنواع مختلفة من الخطوات:
- تُنشئ خطوات نقطة النهاية وقاعدة البيانات بيانات متعلقة بالأعمال.
- تتحكم خطوات الحلقات في تدفق المنطق.
- تُستخدم خطوات البرامج النصية لمعالجة البيانات وتحويلها.
من خلال الجمع بين الإشارة إلى القيمة الديناميكية واستخلاص المتغيرات، يمكنك تصميم عملية اختبار مرنة وقوية تعتمد على البيانات.
أفضل الممارسات لتمرير البيانات:
- استخدم الإشارة إلى القيمة الديناميكية للبيانات البسيطة التي تُستخدم مرة واحدة فقط أو في بعض الأحيان.
- استخدم استخلاص المتغيرات للبيانات التي تحتاج إلى إعادة استخدامها عبر خطوات متعددة أو معالجتها في البرامج النصية.
سيجعل اختيار الطريقة الصحيحة بناءً على تعقيد البيانات وتكرار الاستخدام سير عملك أكثر قابلية للصيانة وفعالية.
