مدیریت گزینهها در قلب رویکرد ماژولار فدراسیون تجارت قرار دارد. به طور خاص، گزینهها مکانیسمی هستند که به وسیله آن توسعهدهنده، یکپارچهساز و اجراکننده تست میتوانند بدون نیاز به تکرار کار یکدیگر با هم همکاری کنند. به عبارت ساده، پیادهسازی ما از مدیریت گزینهها به توسعهدهنده اجازه میدهد تا یک عضو کلاس جاوا را به عنوان قابل پیکربندی علامتگذاری کند، در این مرحله مقدار آن عضو میتواند توسط یکپارچهساز افزایش یا لغو شود و متعاقباً میتواند توسط اجراکننده تست افزایش یا لغو شود. این مکانیسم برای همه انواع ذاتی جاوا و همچنین برای هر نمونه Map یا Collection از انواع ذاتی کار میکند.
نکته: مکانیزم مدیریت گزینهها فقط برای کلاسهایی که یکی از رابطهای موجود در چرخه حیات تست را پیادهسازی میکنند، و فقط زمانی که آن کلاس توسط ماشین چرخه حیات نمونهسازی شده باشد، کار میکند.
توسعهدهنده
برای شروع، توسعهدهنده یک عضو را با حاشیهنویسی @Option علامتگذاری میکند. آنها (حداقل) مقادیر name و description را مشخص میکنند، که نام آرگومان مرتبط با آن گزینه و توضیحاتی را که هنگام اجرای دستور با --help یا --help-all در کنسول TF نمایش داده میشود، مشخص میکنند.
به عنوان مثال، فرض کنید میخواهیم یک تست تلفن کاربردی بسازیم که با شمارههای مختلف تماس بگیرد و انتظار داشته باشد پس از اتصال، از هر شماره، توالی از بوقهای 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>
اجراکننده تست
اجراکنندهی آزمایشی (Test Runner) همچنین از طریق کنسول فدراسیون تجارت (Trade Federation) به این نقاط پیکربندی دسترسی دارد. اول و مهمتر از همه، آنها یک دستور (یعنی یک پیکربندی و تمام آرگومانهای آن) را با دستور run command <name> (یا به اختصار run <name> ) اجرا میکنند. فراتر از آن، آنها میتوانند هر لیستی از آرگومانها را که بخشی از دستور هستند، مشخص کنند که میتوانند فیلدهای مشخص شده توسط اشیاء چرخهی حیات (lifecycle objects) را در هر پیکربندی جایگزین یا به آنها اضافه کنند.
برای اجرای تست تأخیر کم با شماره تلفنهای 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 به عنوان پیادهسازی اصلی در نظر گرفته شده باشد، تمام مقادیر به ترتیبی که در خط فرمان مشخص شده است، ذخیره میشوند.
گزینههای بولی
گزینههایی که از نوع بولی هستند و زیربنای آنها هستند را میتوان با ارسال مستقیم نام گزینه، مثلاً --[option-name] روی true تنظیم کرد و میتوان آنها را با استفاده از سینتکس --no-[option-name] روی false تنظیم کرد.