تتضمّن معالجة الخيارات جوهر النهج المعياري الذي تتّبعه Trade Federation. على وجه الخصوص، تشكّل الخيارات الآلية التي يمكن للمطوّر والمدمج ومشغّل الاختبار العمل معًا من خلالها بدون الحاجة إلى تكرار عمل بعضهم البعض. ببساطة، يتيح تنفيذنا لعملية معالجة الخيارات للمطوّر إمكانية وضع علامة على أحد عناصر فئة Java باعتباره قابلاً للإعداد، وعندئذٍ يمكن للمدمج زيادة قيمة هذا العنصر أو إلغاءها، ويمكن لمشغّل الاختبار زيادة هذه القيمة أو إلغاءها لاحقًا. تعمل هذه الآلية مع جميع أنواع Java الأساسية، بالإضافة إلى أي مثيلات Map
أو Collection
للأنواع الأساسية.
ملاحظة: لا تعمل آلية معالجة الخيارات إلا مع الفئات التي تنفّذ إحدى الواجهات المضمّنة في دورة حياة الاختبار، وفقط عندما يتم إنشاء مثيل لهذه الفئة بواسطة آلية دورة الحياة.
المطوّر
في البداية، يضع المطوّر التعليق التوضيحي @Option
على أحد العناصر.
تحدّد هذه السمة (كحد أدنى) القيمتَين name
وdescription
، اللتَين تحدّدان اسم الوسيط المرتبط بهذا الخيار، والوصف الذي يظهر على
وحدة تحكّم TensorFlow عند تنفيذ الأمر باستخدام --help
أو --help-all
.
على سبيل المثال، لنفترض أنّنا نريد إنشاء اختبار وظيفي للهاتف يطلب أرقام هواتف متنوعة، ويتوقّع تلقّي سلسلة من نغمات DTMF من كل رقم بعد الاتصال.
public class PhoneCallFuncTest extends IRemoteTest { @Option(name = "timeout", description = "How long to wait for connection, in millis") private long mWaitTime = 30 * 1000; // 30 seconds @Option(name = "call", description = "Key: Phone number to attempt. " + "Value: DTMF to expect. May be repeated.") private Map<String, String> mCalls = new HashMap<String, String>; public PhoneCallFuncTest() { mCalls.add("123-456-7890", "01134"); // default }
هذا كل ما يحتاج إليه المطوِّر لإعداد نقطتَي ضبط لهذا الاختبار. يمكنه بعد ذلك استخدام mWaitTime
وmCalls
كالمعتاد،
بدون الانتباه كثيرًا إلى أنّه يمكن ضبطهما. بما أنّ الحقول @Option
يتم ضبطها بعد إنشاء مثيل للفئة، ولكن قبل استدعاء الطريقة run
، يوفّر ذلك طريقة سهلة للمنفّذين لإعداد القيم التلقائية أو إجراء نوع من الفلترة على الحقلَين Map
وCollection
، اللذين لا يمكن تعديلهما إلا من خلال الإضافة.
الشركة المتعهّدة
يعمل Integrator في عالم الإعدادات التي تتم كتابتها بتنسيق XML. يتيح تنسيق الإعدادات للمدمج ضبط (أو إضافة) قيمة لأي حقل @Option
. على سبيل المثال،
لنفترض أنّ المدمج أراد تحديد اختبار بوقت استجابة منخفض يستدعي الرقم التلقائي،
بالإضافة إلى اختبار طويل الأمد يستدعي مجموعة متنوعة من الأرقام. ويمكنهم إنشاء مجموعة من الإعدادات
قد تبدو على النحو التالي:
<?xml version="1.0" encoding="utf-8"?> <configuration description="low-latency default test; low-latency.xml"> <test class="com.example.PhoneCallFuncTest"> <option name="timeout" value="5000" /> </test> </configuration>
<?xml version="1.0" encoding="utf-8"?> <configuration description="call a bunch of numbers; many-numbers.xml"> <test class="com.example.PhoneCallFuncTest"> <option name="call" key="111-111-1111" value="#*#*TEST1*#*#" /> <option name="call" key="222-222-2222" value="#*#*TEST2*#*#" /> <!-- ... --> </test> </configuration>
Test Runner
يمكن لأداة Test Runner أيضًا الوصول إلى نقاط الإعداد هذه من خلال وحدة تحكّم Trade Federation.
أولاً وقبل كل شيء، يتم تنفيذ أمر (أي إعداد وجميع وسيطاته) باستخدام التعليمات run command <name>
(أو run <name>
للاختصار).
بالإضافة إلى ذلك، يمكنهم تحديد أي قائمة وسيطات كجزء من الأمر، والتي يمكن أن تحل محل الحقول المحددة بواسطة عناصر دورة الحياة أو يتم إلحاقها بها ضمن كل إعداد.
لتنفيذ اختبار وقت الاستجابة المنخفض باستخدام أرقام الهواتف many-numbers
، يمكن أن ينفّذ Test Runner ما يلي:
tf> run low-latency.xml --call 111-111-1111 #*#*TEST1*#*# --call 222-222-2222 #*#*TEST2*#*#
أو للحصول على تأثير مشابه من الاتجاه المعاكس، يمكن أن يقلّل Test Runner وقت الانتظار لاختبار many-numbers
:
tf> run many-numbers.xml --timeout 5000
ترتيب الخيارات
قد تلاحظ أنّ التنفيذ الأساسي للخيار call
هو Map
،
لذا عند تكرار --call
في سطر الأوامر، يتم تخزينها جميعًا.
لا يمكن للخيار timeout
، الذي يتضمّن تنفيذًا أساسيًا لـ long
، تخزين سوى قيمة واحدة. لذلك يتم تخزين القيمة الأخيرة المحدّدة فقط.
--timeout 5 --timeout 10
نتيجة في timeout
تحتوي على 10
في حال استخدام List
أو Collection
كعملية تنفيذ أساسية، يتم تخزين جميع القيم بالترتيب المحدّد في سطر الأوامر.
خيارات القيم المنطقية
يمكن ضبط خيارات النوع الأساسي المنطقي على true
من خلال تمرير اسم الخيار مباشرةً، على سبيل المثال، --[option-name]
، ويمكن ضبطها على false
باستخدام بناء الجملة --no-[option-name]
.