การจัดการตัวเลือกเป็นหัวใจสำคัญของแนวทางแบบโมดูลของ Trade Federation โดยเฉพาะอย่างยิ่ง ตัวเลือกเป็นกลไกที่นักพัฒนาซอฟต์แวร์ ผู้ผสานรวม และ Test Runner สามารถทํางานร่วมกันได้โดยไม่ต้องทํางานซ้ำกัน กล่าวโดยย่อคือ การใช้การจัดการตัวเลือกของเราช่วยให้นักพัฒนาซอฟต์แวร์ทําเครื่องหมายสมาชิกคลาส Java ว่ากําหนดค่าได้ เมื่อถึงจุดนั้น ผู้ผสานรวมจะเพิ่มหรือลบล้างค่าของสมาชิกนั้นได้ และ Test Runner จะเพิ่มหรือลบล้างค่าดังกล่าวในภายหลัง กลไกนี้ใช้ได้กับประเภทอินทริเนนต์ของ 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 }
เพียงเท่านี้นักพัฒนาแอปก็ตั้งค่าการกําหนดค่า 2 จุดสําหรับการทดสอบได้แล้ว จากนั้นผู้ใช้สามารถปิดและใช้งาน mWaitTime
และ mCalls
ได้ตามปกติโดยไม่ต้องสนใจมากนักว่าสามารถกําหนดค่าได้ เนื่องจากระบบจะตั้งค่าช่อง @Option
หลังจากสร้างอินสแตนซ์ของคลาสแล้ว แต่ก่อนที่จะเรียกใช้เมธอด run
ซึ่งช่วยให้ผู้ใช้งานตั้งค่าเริ่มต้นหรือทำการกรองบางอย่างในช่อง Map
และ Collection
ได้ง่าย ซึ่งปกติแล้วจะเป็นการเพิ่มต่อท้ายเท่านั้น
ผู้รวมบริการ
ผู้ผสานรวมจะทํางานในโลกของการกำหนดค่าซึ่งเขียนด้วย XML รูปแบบการกําหนดค่าช่วยให้ผู้ผสานรวมกําหนด (หรือเพิ่ม) ค่าสําหรับช่อง @Option
ได้ ตัวอย่างเช่น สมมติว่าผู้ผสานรวมต้องการกำหนดการทดสอบที่มีเวลาในการตอบสนองต่ำลงซึ่งเรียกหมายเลขเริ่มต้น รวมถึงการทดสอบที่ทำงานต่อเนื่องเป็นเวลานานซึ่งเรียกหมายเลขต่างๆ ผู้ใช้อาจสร้างการกําหนดค่า 2 รายการที่มีลักษณะดังนี้
<?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
ตัวเรียกใช้การทดสอบอาจดำเนินการต่อไปนี้
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]