يقع التعامل مع الخيارات في صميم النهج المعياري لاتحاد التجارة. على وجه الخصوص ، تعد الخيارات الآلية التي يمكن من خلالها للمطور والمتكامل وعارض الاختبار العمل معًا دون الحاجة إلى تكرار عمل بعضهم البعض. ببساطة ، يتيح تطبيقنا للتعامل مع الخيارات للمطور وضع علامة على عضو فئة Java على أنه قابل للتكوين ، وعند هذه النقطة يمكن زيادة قيمة هذا العضو أو تجاوزها بواسطة المُتكامل ، وقد يتم زيادتها أو تجاوزها لاحقًا بواسطة عداء الاختبار. تعمل هذه الآلية لجميع أنواع Java الجوهرية ، بالإضافة إلى أي Map
أو Collection
من الأنواع الجوهرية.
ملاحظة: تعمل آلية معالجة الخيارات فقط للفئات التي تنفذ إحدى الواجهات المضمنة في دورة حياة الاختبار ، وفقط عندما يتم إنشاء مثيل لهذه الفئة بواسطة آلية دورة الحياة.
مطور
للبدء ، يضع المطور علامة على العضو @Option
التوضيحي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
بتعيين (أو إلحاق) قيمة لأي حقل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
، يمكن لـ Test Runner تنفيذ ما يلي:
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]
.