يقع التعامل مع الخيارات في قلب النهج المعياري الذي يتبعه الاتحاد التجاري. على وجه الخصوص، الخيارات هي الآلية التي يمكن من خلالها للمطور والمتكامل ومشغل الاختبار العمل معًا دون الحاجة إلى تكرار عمل بعضهم البعض. ببساطة، يتيح تنفيذنا لمعالجة الخيارات للمطور وضع علامة على عضو فئة Java باعتباره قابلاً للتكوين، وعند هذه النقطة يمكن زيادة قيمة هذا العضو أو تجاوزها بواسطة المُدمج، ويمكن زيادتها أو تجاوزها لاحقًا بواسطة مشغل الاختبار. تعمل هذه الآلية مع جميع أنواع Java الجوهرية، بالإضافة إلى أي Map
أو Collection
من الأنواع الجوهرية.
ملاحظة: تعمل آلية معالجة الخيارات فقط مع الفئات التي تنفذ إحدى الواجهات المضمنة في دورة حياة الاختبار ، وفقط عندما يتم إنشاء مثيل لهذه الفئة بواسطة آلية دورة الحياة.
مطور
للبدء، يقوم المطور بوضع علامة على العضو باستخدام التعليق التوضيحي @Option
. وهي تحدد (كحد أدنى) قيم name
description
، التي تحدد اسم الوسيطة المرتبط بهذا الخيار، والوصف الذي سيتم عرضه على وحدة تحكم TF عند تشغيل الأمر باستخدام --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
، والتي يتم إلحاقها بخلاف ذلك- فقط.
متكامل
يعمل المتكامل في عالم التكوينات المكتوبة بلغة 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>
عداء الاختبار
يتمتع مشغل الاختبار أيضًا بإمكانية الوصول إلى نقاط التكوين هذه عبر وحدة تحكم الاتحاد التجاري. أولاً وقبل كل شيء، سيقومون بتشغيل أمر (أي التكوين وجميع وسائطه) باستخدام run command <name>
(أو run <name>
للاختصار). علاوة على ذلك، يمكنهم تحديد أي قائمة من الوسائط لتكون جزءًا من الأمر، والتي قد تحل محل أو تلحق الحقول المحددة بواسطة كائنات دورة الحياة داخل كل تكوين.
لتشغيل اختبار زمن الوصول المنخفض باستخدام أرقام الهواتف many-numbers
، يمكن لمشغل الاختبار تنفيذ ما يلي:
tf> run low-latency.xml --call 111-111-1111 #*#*TEST1*#*# --call 222-222-2222 #*#*TEST2*#*#
أو، للحصول على تأثير مماثل من الاتجاه المعاكس، يمكن لمشغل الاختبار تقليل وقت الانتظار لاختبار 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]
.