Sử dụng JAVA API trong Rational Functional Tester của IBM để cập nhật các ánh xạ đối tượng

Bài viết này cung cấp một cuộc thảo luận chi tiết về cách bạn có thể sử dụng Java™ API của Rational® Functional Tester của IBM® để sửa đổi các định nghĩa các ánh xạ đối tượng (Object Maps) và đối tượng giao diện đồ họa người dùng (GUI) đã lưu trong chúng. Rational Functional Tester có một giao diện trực quan qua đó bạn có thể xem, thêm, cập nhật và xóa các đặc tính của các MappedTestObject (Các đối tượng thử nghiệm được ánh xạ) trong một Object Map (Ánh xạ đối tượng). Nó cũng có một API trưng ra để thực hiện các hoạt động này mà không cần sử dụng một giao diện đồ họa.

Rajanikant Malviya, Kỹ sư phần mềm, IBM

photo of R MalviyaRajanikant Malviya là một kỹ sư phần mềm làm việc với các phòng thí nghiệm phần mềm Ấn Độ của IBM. Anh đã có hơn 6 năm kinh nghiệm trong thiết kế các nền tảng và cơ sở hạ tầng thực hiện dựa trên Java. Anh say mê về thiết kế các khung công tác



Varun Mishra, Kỹ sư phần mềm, IBM  

photo of V MishraVarun Mishra là một kỹ sư thử nghiệm tự động hóa làm việc trong các phòng thí nghiệm phần mềm Ấn Độ của IBM. Anh chịu trách nhiệm phát triển các khung công tác thử nghiệm tự động hóa cho các ứng dụng khác nhau trong bộ sản phẩm Cognos của IBM. Anh là một chuyên gia về Rational Functional Tester có chứng chỉ của IBM và có chuyên môn về các công cụ thử nghiệm tự động hóa như: HP Quick Test Professional và các khung công tác thử nghiệm hộp trắng như JUnit. Anh là một cộng tác viên nhiệt thành cho các diễn đàn tự động hóa khác nhau và say mê về thiết kế và phát triển của các khung công tác thử nghiệm tự động hóa.



18 08 2011

Mở đầu

Trong Rational® Functional Tester của IBM®, Object Map (Ánh xạ đối tượng) là một công cụ mạnh để lưu trữ các định nghĩa đối tượng thử nghiệm của các đối tượng GUI hiện có trong các ứng dụng đang thử nghiệm. Những định nghĩa này bao gồm các đặc tính phân cấp của TestObject (Đối tượng thử nghiệm), cùng với các đặc tính nhận dạng quan trọng được sử dụng để tìm các đối tượng GUI hiện tại. Các TestObject có các đặc tính của chúng bị bắt giữ và được lưu trong một Object Map được gọi là các MappedTestObject.

Rational Functional Tester (Nhà thử nghiệm chức năng Rational) cung cấp một giao diện rất trực quan qua đó bạn có thể xem, thêm, cập nhật và xóa các đặc tính của MappedTestObjects trong một Object Map. Nó cũng có một API trưng ra để thực hiện các hoạt động này mà không cần sử dụng một giao diện đồ họa. Mục tiêu của bài viết này là để thảo luận về các cuộc gọi API đó. Nó trình bày cụ thể cách bạn có thể sử dụng Java™ API của Rational Functional Tester để:

  • Nạp các Object Map bất kỳ vào trong một kịch bản lệnh.
  • Lặp lại các đối tượng thử nghiệm đã lưu trong các Object Map.
  • Thay đổi các đặc tính của các đối tượng thử nghiệm đã lưu trong các Object Map.
  • Thêm các đối tượng thử nghiệm mới vào các Object Map.
  • Kết hợp các Object Map.

Nạp các Object Map bất kỳ vào một kịch bản lệnh

Vì các MappedTestObject được lưu trong một Object Map, bạn cần phải nhận được một cá thể của Object Map tương ứng trước khi truy cập các MappedTestObject.

Bạn có thể nạp một Object Map được kết hợp với kịch bản lệnh hiện tại của bạn bằng cách sử dụng getMap(), một phương thức được định nghĩa trong RationalTestScript. Các đoạn mã được hiển thị trong Liệt kê 1 mô tả cách làm điều đó.

Liệt kê 1. Nạp Object Map liên kết
ObjectMap map = getMap();

Nếu bạn muốn truy cập một đối tượng thử nghiệm được lưu trữ trong một số tệp Object Map khác, bạn sẽ phải có được đường dẫn của nó và tạo một đối tượng tệp chỉ vào nó và cuối cùng, chuyển đối tượng tệp này tới phương thức load() tĩnh của lớp ObjectMap. Ví dụ, nếu bạn muốn nạp TestObjectMap1.rftmap (xem Hình 1) bạn có thể làm như trong Liệt kê 2.

Hình 1. Cấu trúc dự án
Các ObjectMap chia sẻ và định vị TestScript.
Liệt kê 2. Nạp Object Map không liên kết
String mapLocation =
		getCurrentProject().getLocation() + File.separator
				+ "ObjectMaps\\TestObjectMap1";
File mapFile = new File(mapLocation);
ObjectMap map = ObjectMap.load(mapFile);

Lặp lại các MappedTestObjec đã lưu trong Object Map

Sau khi bạn đã nạp Object Map cần thiết, bạn có thể truy cập tất cả các định nghĩa GUI đã lưu trong nó. Như đã nói ở trên, các định nghĩa này được lưu trữ như là một cá thể của lớp MappedTestObject. Mỗi lớp MappedTestObject lưu một danh sách các cặp khóa và giá trị của các đặc tính (dưới dạng MappedTestObjectProperty) để định nghĩa nhận dạng cũng như các đặc tính quản trị của đối tượng GUI tương ứng.

Để nhận được một danh sách tất cả các lớp MappedTestObjects đã lưu trong Object Map đã nạp, bạn có thể sử dụng phương thức elements() của lớp ObjectMap . Khi bạn nắm giữ một lớp MappedTestObject, duy nhất, bạn có thể nhận được các thông tin chi tiết về khóa và giá trị của các đặc tính bằng nhiều cách. Liệt kê 3a mô tả một cách nhận được các thông tin chi tiết về khóa và giá trị của các đặc tính như vậy. Phương thức được mô tả lấy đường dẫn tuyệt đối của ObjectMap làm một tham số đầu vào, rồi in ra khóa, giá trị và trọng số đặc tính của tất cả các MappedTestObjects được lưu trong tệp ObjectMap. Các khóa đặc tính có một tiền tố # (dấu thăng) là các đặc tính quản trị, trong khi các đặc tính không có dấu thăng là các đặc tính nhận dạng. Bạn cũng sẽ thấy rằng tất cả các đặc tính quản trị có trọng số bằng không.

Liệt kê 3a. Liệt kê các đặc tính của tất cả các MappedTestObject
publicvoid listPropOfAllMappedObjects(String mapFilePath)
	{
		File mapFile = new File(mapFilePath);
		ObjectMap map = ObjectMap.load(mapFile);
		Enumeration<MappedTestObject> elts = map.elements();
		while (elts.hasMoreElements())
		{
			MappedTestObject guiObject = elts.nextElement();
			String[] propNames = guiObject.getPropertyNames();
			for (int i = 0; i < propNames.length; i++)
			{
				String key = propNames[i];
				MappedTestObjectProperty propData =
				        guiObject.getPropertyData(key);
				System.out.println(key + ": " + propData.getValue() + "::"
				        + propData.getWeight());
			}
			System.out.println("*****************************");
		}
	}

Khi bạn thực thi đoạn mã trên một Object Map có chứa nút Search (Tìm kiếm) của Google, bạn sẽ nhận được các kết quả tương tự như kết quả được mô tả trong Liệt kê 3b.

Liệt kê 3b. Đầu ra bàn điều khiển của nút Google Search.
*****************************
…
…
…

#proxy: .html.PushbuttonProxy::0
.id: ::90
.type: submit::95
#name: GoogleSearchsubmit::0
#testobject: GuiTestObject::0
.value: Google Search::100
.title: ::50
.class: Html.INPUT.submit::100
#simplename: Google Searchsubmit::0
#domain: Html::0
#id: 1L.12GkpbF04AhC:QxlgP:MatubLP:8WU::0
##parent: HtmlTable_0:1K.12GkpbF04AhC:QxlgP:MatubLP:8WU::0
.name: btnG::90
#role: Button::0
.classIndex: 0::50
*****************************

Sau khi bạn nhận được một cá thể của một MappedTestObject, bạn có thể sử dụng các phương thức khác để nhận được nhiều thông tin chi tiết hơn về đối tượng GUI. Ví dụ, nếu guiObject là một cá thể của một MappedTestObject thì các điều sau sẽ xảy ra:

  • guiObject.isDescriptionObject() trả về cho dù đối tượng hiện tại là một đối tượng thử nghiệm động hay không. Các đối tượng thử nghiệm động không theo một hệ thống phân cấp chặt chẽ. Một đối tượng thử nghiệm động được neo giữ làm một đối tượng hậu duệ của đối tượng cha mẹ của nó, do đó một sự thay đổi trong hệ thống phân cấp của ứng dụng đang thử nghiệm không cản trở việc nhận biết đối tượng.
  • guiObject.isNew() thông báo liệu đối tượng đã được bổ sung gần đây chưa.

Thay đổi các đặc tính của đối tượng đã lưu trong các Object Map

Khi nào bạn cần thay đổi các đặc tính nhận dạng của các đối tượng GUI trong thời gian chạy?

Các điều khiển giao diện đồ họa người dùng (GUI) được nhận dạng trong ứng dụng đang thử nghiệm trên cơ sở các đặc tính nhận dạng duy nhất của chúng. Nhưng có rất nhiều trường hợp ở đó các giá trị đặc tính nhận dạng duy nhất thay đổi. Chúng có thể thay đổi do sự thay đổi trong dữ liệu thử nghiệm, môi trường thử nghiệm hoặc do sự thay đổi trong các phiên bản mới của ứng dụng đang thử nghiệm.

Ví dụ, các điều khiển GUI với các nhãn danh từ (các tên, thành phố, tuổi, và v.v..), các trường ngày và các URL phụ thuộc vào dữ liệu thử nghiệm hoặc môi trường thử nghiệm. Các điều khiển GUI khác như các nút, các hộp kiểm tra, các thẻ và các tiêu đề trang thay đổi cùng với những thay đổi trong phiên bản sản phẩm (ví dụ, tất cả các nút OK có thể được thay bằng Done). Các kỹ sư thử nghiệm tự động hóa hoặc sử dụng lập trình động trong kịch bản lệnh hoặc các biểu thức chính quy bên trong các Object Map, để xử lý các điều khiển động như vậy. Một cách thông minh hơn để xem xét toàn bộ các điều khiển như vậy là cập nhật các đối tượng GUI đã lưu trong Object Map với các đặc tính mới ngay trước khi thực hiện thử nghiệm.

Để thay đổi một đặc tính của đối tượng GUI mong muốn sang một giá trị mới, đầu tiên bạn cần lặp lại thông qua Object Map và nhận MappedTestObject cần thiết liên quan đến việc điều khiển GUI mong muốn. Việc tìm kiếm được thực hiện bằng cách sử dụng một tập hợp các cặp giá trị-khóa đặc tính. Khi bạn nhận được cá thể mong muốn, bạn có thể sử dụng phương thức setProperty() để thay đổi các giá trị của các đặc tính nhận dạng của nó. Có hai biến của phương thức này. Biến đầu tiên dùng một cá thể MappedTestObjectProperty trong khi biến khác lại trực tiếp lấy khóa, giá trị và trọng số đặc tính làm các tham số đầu vào. Để thay đổi các đặc tính quản trị, có các phương thức riêng như setProxy(), setRole(), v.v..

Lời khuyên: Nếu bạn muốn thay đổi hẳn, bạn sẽ cần phải lưu lại ánh xạ đã cập nhật vào tệp của nó.

Liệt kê 4 sửa đổi một nút Google Search thành một nút I’m Feeling Lucky (Tôi cảm thấy may mắn). Trong lúc thực hiện phương thức changeObjectProperty() bạn sẽ thấy rằng nút Google Search đã được cập nhật bằng các đặc tính của một nút I’m Feeling Lucky, như trong Hình 2.

Liệt kê 4. Phương thức để thay đổi các đặc tính của MappedTestObject
publicvoid changeObjectProperty()
{
	Enumeration<MappedTestObject> elts = getMap().elements();
	while (elts.hasMoreElements())
	{
		MappedTestObject obj = elts.nextElement();
		MappedTestObjectProperty toProperty = obj.getPropertyData(".name");
		if ((toProperty != null)
		        && (toProperty.getValue().equals("btnG")))
		{
			// Method 1
			MappedTestObjectProperty newProperty =
			        new MappedTestObjectProperty(".name", "btnI", 100);
			obj.setProperty(newProperty);
			// Method 2
			obj.setProperty(".value", "I'm Feeling Lucky", 100);
			System.out.println("Properties changed !!");
			break;
		}
	}
	// store back in file for future use.
	ObjectMap.store(getMap(), getMap().getFile());
}
Hình 2. Các đặc tính của nút Google Search đã thay đổi
Các đặc tính thay đổi của nút Google Search.

Thêm động đối tượng mới vào các Object Map

Để thêm một đối tượng GUI mới vào ánh xạ, trước tiên bạn sẽ phải tạo một cá thể MappedTestObject mới.

Trong lúc định nghĩa, bạn sẽ phải thiết lập cả hai đặc tính nhận dạng và quản trị. Hơn nữa, bạn cũng cần định nghĩa đối tượng cha mẹ của cá thể MappedTestObject. Nếu đối tượng thử nghiệm mới này không có đối tượng cha mẹ trực tiếp cố định, thì bạn có thể gán bất kỳ các đối tượng ông bà nào của nó làm đối tượng cha mẹ và sau đó đánh dấu đối tượng mới như là một đối tượng động bằng cách thiết lập setDescriptionObject(true).

Liệt kê 5 cho thấy cách bạn thêm nút I’m Feeling Lucky vào Object Map làm đối tượng con của trình duyệt (đối tượng mức đỉnh) và tạo nó động. Hình 3 cho thấy Object Map đã cập nhật.

Liệt kê 5. Thêm TestObject mới trong Object Map
publicvoid addObjectToObjectMap() {
		ObjectMap map  = getMap();
		int initialMapSize = map.size();
		
		// create a new TestObject and set its properties.
		MappedTestObject mto  = new MappedTestObject();
		mto.setClassName("Html.INPUT.submit");
		mto.setDescriptiveName("Feeling Lucky");
		mto.setDomainName("Html");
		mto.setNameInScript("Lucky");
		mto.setProperty(".value", "I'm Feeling Lucky", 100);
		mto.setProperty(".name", "btnI", 100);
		mto.setProxyClassName(".html.PushbuttonProxy");
		mto.setRole("Button");
		mto.setTestObjectClassName("GuiTestObject");
		// set some object as its parent
		mto.setParent(map.getTopLevelObjects()[0]);
		// now make it dynamic test object.
		mto.setDescriptionObject(true);
		
		// finally add testobject to map.
		map.addElement(mto);
		
		//simply verify that map size has increased by one.
		System.out.println("Object Map updated - "+ (map.size()>initialMapSize));
		
		// save Object Map back to file
		ObjectMap.store(map, map.getFile()); 
	}
Hình 3. Thêm động nút I’m Feeling Lucky vào Object Map
Nút I'm Feeling Lucky được chèn vào trong Object Map

Hãy nhớ rằng bạn rõ ràng phải thêm đối tượng thử nghiệm mới vào kịch bản lệnh trước khi có thể sử dụng nó.


Kết hợp động Object Map

Bạn đã thấy cách lặp lại thông qua các MappedTestObjects, nhận các đặc tính của chúng, thay đổi các đặc tính của chúng và thêm các MappedTestObjects mới vào Object Map. Bây giờ chúng ta hãy xem cách bạn có thể kết hợp hai Object Map khác nhau. Tính năng kết hợp của Object Map được sử dụng để tích hợp hai Object Map khác nhau thành một Object Map. Nó thực sự sao chép tất cả các MappedTestObjects bổ sung từ ánh xạ nguồn vào ánh xạ đích. Ánh xạ nguồn vẫn còn nguyên không thay đổi, trong khi ánh xạ đích nhận được một MappedTestObject bổ sung.

Trên Rational Functional Tester bạn cần nhấn chuột phải vào Object Map đích và chọn Merge Objects Into (Kết hợp các đối tượng vào) (như trong Hình 4).

Hình 4. Chọn Object Map đích để kết hợp
Trình đơn bật lên để kết hợp các Object Map

Trong hộp thoại kế tiếp, chọn Object Map nguồn, như trong Hình 5.

Hình 5. Chọn Object Map nguồn để kết hợp
Trình thủ thuật để kết hợp các Object Map

Bạn có thể hoàn thành các bước bằng lập trình khi sử dụng phương thức mergeMaps() như trình bày chi tiết trong Liệt kê 6.

Liệt kê 6. Kết hợp hai Object Map.
public void mergeMaps(String targetMapPath, String sourceMapPath){
	ObjectMap targetMap = ObjectMap.load(new File(targetMapPath));
	ObjectMap sourceMap = ObjectMap.load(new File(sourceMapPath));
	targetMap.merge(sourceMap); // copies contents of sourceMap into targetMap
	ObjectMap.store(targetMap, targetMap.getFile());
}

Tóm tắt

Bài viết này chỉ cho bạn cách sửa đổi các Object Map và các định nghĩa TestObject bằng lập trình. Khi sử dụng các kỹ thuật này, bạn có thể thiết kế khung công tác tự động hóa cho ứng dụng của bạn. Khung công tác này độc lập với miền và nội dung và đủ mạnh để thích ứng với một ứng dụng thay đổi có các thay đổi tối thiểu cho chính nó (hầu hết thường chỉ cần thay đổi các đầu vào điều khiển). Ví dụ, bạn có thể cung cấp một tệp bên ngoài có chứa các cặp giá trị đặc tính đã cập nhật để sửa đổi tất cả hoặc một vài ánh xạ của bạn. Bạn cũng có thể có nhiều Object Map (tức là một Object Map cho mỗi khung nhìn của ứng dụng) và sau đó kết hợp chúng trước khi thực hiện thử nghiệm để truy cập các ánh xạ khác nhau trong cùng một kịch bản lệnh.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

  • Tham gia diễn đàn thử nghiệm hiệu năng, nơi bạn có thể chia sẻ những câu hỏi và kiến thức của bạn về các sản phẩm thử nghiệm hiệu năng của IBM.
  • Hãy dành tâm trí cho cộng đồng My developerWorks. Kết nối với những người sử dụng developerWorks khác trong khi khám phá các blog hướng-nhà phát triển, các diễn đàn, các nhóm như Rational Café và wiki.

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Rational
ArticleID=752953
ArticleTitle=Sử dụng JAVA API trong Rational Functional Tester của IBM để cập nhật các ánh xạ đối tượng
publish-date=08182011