Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 46 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
46
Dung lượng
0,98 MB
Nội dung
305 Enhancing the AutomatedGUITest Tool AutomatedGUITest class. You can refer to the full listing by downloading the sample source code from this book’s web pages at www.sybex.com. The next section will guide you through entering the last batch of code into the GUITestScript class. Updating the GUITestScript Class Since verifications happen after the execution of the test, the modification of the AutomateGUITest class and the GUITestDataCollector class prepares basic information for verification. The final verification occurs within the GUITestScript class. In this section, you will add code to obtain a fully functional test script and complete the project with many of the advanced testing functions. The modifications in this chapter often involve the addition of some new fields. The GUITestScript class also needs new fields, as shown here: private TypeVerification testResult; private int MaxLen = 10000; The first field is in the place of the private ArrayList resultList as coded in Chapter 7. Thus, after the addition of the new field, you can remove the declaration of the resultList object. The second field initializes an integer variable as the definition of the maximum length of a string this test script can extract from a GUI control. The value 10,000 is an arbitrary number that represents the maximum length of a text string the tool can hold. Next, you need to modify the four Timer tick events. The tmrAutomatedTest_Tick() event code after the modification should be similar to the code in Listing 8.24 (the newly added lines are in bold and an obsolete line is commented and in bold). ➲ Listing 8.24 The Modified Code for the tmrAutomatedTest_Tick() Event private void tmrAutomatedTest_Tick(object sender, System.EventArgs e) { StartAUT(); tmrAutomatedTest.Enabled = false; tmrRunScript.Enabled = true; //resultList = new ArrayList(); testResult = new TypeVerification(); testResult.AUTPath = seqGUIUT.AUTPath; testResult.TypeName = seqGUIUT.AUTStartupForm; } 4351Book.fm Page 305 Tuesday, September 28, 2004 11:21 AM 306 Chapter 8 • Methods of GUI Test Verification The new lines of code simply initialize the newly added field, a testResult object of the TypeVerification class. The initialization includes tagging this object with the pathname of the AUT and its startup form. It will be used to store the verification results step-by-step dur- ing the test execution and make the result persistent. The tmrStopScript_Tick() event is another easy update, as shown in Listing 8.25 (the newly added line is in bold and the obsolete line is commented and in bold). ➲ Listing 8.25 One-Line Addition to the tmrStopScript_Tick() Event private void tmrStopScript_Tick(object sender, System.EventArgs e) { AddTestVerification(); //GUITestUtility.GUIInfo guiUnit = ➥(GUITestUtility.GUIInfo)seqGUIUT.GUIList[clickNum - 1]; //Control ctrlTested; //ctrlTested = (Control)GUITestUtility.VerifyField(AUT, "txtSelected"); //resultList.Add(ctrlTested.Text); if (clickNum >= seqGUIUT.GUIList.Count) { tmrRunScript.Enabled = false; tmrStopScript.Enabled = false; tmrVerifyTest.Enabled = true; AUT.Dispose(); } else { tmrRunScript.Enabled = true; tmrStopScript.Enabled = false; } } The addition simply invokes an AddTestVerification() helper method. The code for this method is in Listing 8.26. ➲ Listing 8.26 A new AddTestVerification() Helper Method to Update the GUITestScript Class private void AddTestVerification() { if (AUT == null) return; string VerifyDataStore = guiTestDataStore.Replace(".xml", "_verify.xml"); TypeVerificationSerializable verifyTypes = new TypeVerificationSerializable(); 4351Book.fm Page 306 Tuesday, September 28, 2004 11:21 AM 307 Enhancing the AutomatedGUITest Tool object obj = (object)verifyTypes; GUITestUtility.DeSerializeInfo(VerifyDataStore, ref obj); verifyTypes = (TypeVerificationSerializable)obj; TypeVerification oneType = ➥(TypeVerification)verifyTypes.TypeList[clickNum - 1]; object resulted = null; foreach (TestExpectation fieldName in oneType.MemberList) { TestExpectation tested = fieldName; try { resulted = GUITestUtility.VerifyField(AUT, tested.VerifyingMember); tested.isField = true; } catch(Exception ex4) { resulted = GUITestUtility.VerifyProperty(AUT, tested.VerifyingMember); tested.isProperty = true; } VerifyAlphanumericResult(ref tested, resulted); VerifyClipboard(ref tested, resulted); } } The first line of the AddTestVerification() helper method obtains the filename of the ver- ification data store by recognizing the suffix, _verify.xml. This suffix was introduced to the testing tool when you modified the AutomatedGUITest class. Then it initializes a new TypeVerificationSerializable instance, verifyTypes. The box- ing method converts the verifyTypes instance into an object instance in order to call the DeSerializeInfo() method from the GUI test library. After the deserialization reconstructs the object, an unboxing method converts this object back to a verifyTypes instance that includes all the members in need of verification. This tool regards each GUI action as a step in the execution of the GUI test. The step is counted by the clickNum variable. Using the value of the clickNum, each step of the test initializes a TypeVerification object, oneType, by retrieving the content from the verifyTypes.TypeList. Then a foreach loop is used to find how many members are specified for verification. Since this helper method needs to assign verification results into the oneType.MemberList, it assigns each fieldName object to a new TestExpectation object, tested. A try-catch clause is used to get the current status of the member in need of verification. Because the member is either a field or a property, the try statement invokes the VerifyField() from the GUI test library. If the try invocation fails, the catch statement invokes the VerifyProperty() method to complete the 4351Book.fm Page 307 Tuesday, September 28, 2004 11:21 AM 308 Chapter 8 • Methods of GUI Test Verification task. The try-catch clause easily tells the verification whether the current member is a field or a property. Finally, it invokes the other two helper methods, VerifyAlphanumericResult() and VerifyClipboard(), to determine whether this verification matches the expected alpha- numeric and the clipboard results at this step of the test. The code for the VerifyAlphanumericResult() method is in Listing 8.27. ➲ Listing 8.27 Code for the VerifyAlphanumericResult() Method private void VerifyAlphanumericResult(ref TestExpectation fieldName, ➥object resulted) { try { Control cntl = (Control)resulted; fieldName.isGUI = true; fieldName.ActualResult = cntl.Text; StringBuilder sb = new StringBuilder(MaxLen); GUITestActions.GetWindowText((int)cntl.Handle, sb, MaxLen); fieldName.ScreenSnapshot = sb.ToString(); } catch (InvalidCastException ex1) { fieldName.ActualResult = resulted.ToString()+ "\n" + ex1.Message; } catch (Exception ex2) { fieldName.ActualResult = ➥fieldName.VerifyingMember + " is not found as a member.\n" + ex2.Message; } fieldName.AssertAlphanumericTest(fieldName.ExpectAlphaNumericEqual); testResult.MemberList.Add(fieldName); } This method takes two parameters. The first parameter holds the verification information and the second holds the object of field or a property. Then it uses a compound try-catch clause. A majority of the verification activities occur inside the try statement. If the member currently being verified is a GUI component, it retrieves the values of the GUI properties and assigns it to the related fields of the first parameter, which is passed by reference. The catch statements are used to report the reason when one line of the code in the try statement encounters an error. After the invocation of the try-catch clause, the AssertAlphanumericTest() method of the GUITestVerification class is called and determines whether to let this test step pass or fail. The verification result is added to the testResult.MemberList and will be serialized at the end of the test. 4351Book.fm Page 308 Tuesday, September 28, 2004 11:21 AM 309 Enhancing the AutomatedGUITest Tool Listing 8.28 shows the code for the VerifyClipboard() method. ➲ Listing 8.28 Code for the VerifyClipboard() Method private void VerifyClipboard(ref TestExpectation fieldName, object resulted) { fieldName.ActualClpbrdObj = ➥Clipboard.GetDataObject().GetData(DataFormats.Text); try { Control cntl = (Control)resulted; fieldName.ExpectedClpbrdObj = cntl.Text; fieldName.AssertClipboardTest(fieldName.ExpectClipBrdEqual); } catch (Exception ex) { Console.WriteLine(ex.Message); } } The VerifyClipboard() method takes the same set of parameters as the VerifyAlphanumeric- Result() method does. It goes directly to the clipboard and gets the actual clipboard content. Then, inside the try statement it retrieves the value of the Text property of the current member if this is a GUI control. The last line of code inside the try statement invokes the AssertClipboardTest() method and determines whether the clipboard content is consistent with the expected result of the GUI control. We discussed a few types of verification at the beginning of this chapter. However, this test script class implements only two examples to verify the alphanumeric results and clipboard results. In order to meet the specific testing requirements of your organization, this kind of implementation leaves enough room for you to enhance the testing capabilities of the tool in the future. In Chapters 9 and 11, for example, you will learn how to add methods to verify the test of Label, CheckBox and RadionButton controls. Now, you have only one more modification for the tmrVerifyTest_Tick() event. Listing 8.29 displays the new code of this event in bold with the obsolete code commented and in bold. ➲ Listing 8.29 Code for the tmrVerifyTest_Tick() Event private void tmrVerifyTest_Tick(object sender, System.EventArgs e) { tmrVerifyTest.Enabled = false; string resultDataStore = guiTestDataStore.Replace(".xml", "_result.xml"); //GUITestUtility.SerilizeInfo(resultDataStore, resultList); 4351Book.fm Page 309 Tuesday, September 28, 2004 11:21 AM 310 Chapter 8 • Methods of GUI Test Verification GUITestUtility.SerilizeInfo(resultDataStore, testResult); //Display the test result try { XmlTreeViewer.Form1 xmlTV = new XmlTreeViewer.Form1(); xmlTV.OpenXmlDoc(resultDataStore); xmlTV.Show(); } catch{} //Test completed this.Dispose(); } When the tmrVerifyTest_Tick() event is ready to be triggered, the test and verification activities have already completed. But the verification result is still not saved and can not be viewed. Without confirmation from a human tester reading the saved test results, the verifica- tion can never be completed. The tmrVerifyTest_Tick() event invokes methods to save the results and displays the results. The test results are saved to a file with a name with a _result.xml suffix, which was intro- duced since Chapter 7. The invocation of the SerilizeInfo() of the GUI test library saves the test and verification results immediately at the end of the test. In fact, this invocation occurred in Chapter 7 for the obsolete resultList object. Then the rest of the new code initializes an XML document viewer object, XmlTreeViewer.Form1, to open the saved XML result docu- ment. At this point, the tester can scrutinize the results and reports the defects found by the testing tool. The developers can view this report to fix the defects. The coding task for the GUITestScript class is completed. If you build the project, you will observe compiling errors. The reason is that there is no implementation of an XmlTreeViewer.Form1 class in the AutomatedGUITest project. In the next section, you will enable this class with a few configuration steps by reusing the XmlTreeViewer project devel- oped in Chapter 5. NOTE For a full code listing of the updated GUITestScript class, you can download the source code from www.sybex.com. Adding the XML Document Viewer for Result Presentation Up to now, there is no implementation of any XML document viewer for the AutomatedGUITest tool. But, you may remember that you developed an XmlTreeViewer project earlier in the book. The XmlTreeViewer project displays XML documents, but editing the XML document is not 4351Book.fm Page 310 Tuesday, September 28, 2004 11:21 AM 311 Enhancing the AutomatedGUITest Tool allowed, which fits the purpose of displaying test results perfectly. You don’t need to add any code to the XmlTreeViewer project to reuse it. You can follow these steps to incorporate it into the AutomatedGUITest project and perform some configuration steps: 1. Copy the XmlTreeViewer project folder with all the files from C:\GUISourceCode\Chapter05\ to the C:\GUISourceCode\Chapter08\ folder. This enables you to organize all the needed project files in the same folder for the AutomatedGUITest project. 2. When the AutomatedGUITest is still open, choose File Add Project Existing Project from the main window of the IDE. 3. When the Add Existing Project dialog box appears, navigate to the C:\GUISourceCode\ Chapter08\XmlTreeViewer folder and select the XmlTreeViewer.csproj project. Click the Open button to finish the addition. 4. In the Solution Explorer of the IDE, select the XmlTreeViewer project and right-click on it. A pop-up menu appears. 5. Choose Properties from the pop-up menu. The XmlTreeViewer Property Pages dialog box appears. 6. In the right pane of the dialog box, use your mouse to locate the Output Type field under the Application category. If the Application category is collapsed, showing a + sign, click the + sign to expand it. The XmlTreeViewer project was originally created as a Windows Application as shown in the Output Type field. In order for it to be used by the Auto- matedGUITest tool as a class library, on the right edge of the Output Type field, click the arrow (similar to the arrow on a combo box) and select Class Library. Finally, click the OK button to close the Property Pages dialog box. 7. From the main window of the IDE, choose Project Add Reference to bring the Add Ref- erence dialog box up. 8. Activate the Projects tab by clicking it. At this point, you have added two projects, GUITest- Library and XmlTreeViewer, into the AutomatedGUITest solution. The GUITestLibrary project has already been referenced in Chapter 7. Select the XmlTreeViewer project and click the OK button to add the reference and close the dialog box. Now, you can build and run the AutomatedGUITest tool by pressing F5 and start to feed it with an application in need of testing. If compiling errors are observed, you can correct the errors by comparing your code with source code downloadable from www.sybex.com. After the AutomatedGUITest project is successfully built, you can go on to the next section, which will demonstrate the new capabilities of the updated GUI testing tool by testing the C# API Text Viewer again. 4351Book.fm Page 311 Tuesday, September 28, 2004 11:21 AM 312 Chapter 8 • Methods of GUI Test Verification Conducting a Fully Automated GUI Test After you press F5 in the Microsoft Visual Studio .NET IDE, the AutomatedGUITest tool is successfully built and runs on your desktop. The use of this tool has been illustrated in the pre- vious chapters. The steps of testing the C# API Text Viewer in this section will be similar to those in Chapter 7: 1. Click the Start GUI Test button. An open file dialog box appears. From this dialog box, navigate to the C:\GUISourceCode\Chapter03\CSharpAPITextViewer\bin\Debug folder, select the CSharpAPITextViewer.exe file, and click the Open button. The Types under Test form shows up with names of the classes implemented for the CSharpAPITextViewer project. One of them is the Form1 class. Select it and click the OK button. 2. The C# API Text Viewer starts on the desktop. If it covers the AutomatedGUITest application, you can rearrange the applications on your screen and make the AutomatedGUITest tool vis- ible. But make sure there is only one copy of the C# API Text Viewer running on your system. 3. Click the GUI Survey button on the AutomatedGUITest tool. The tool minimizes itself to expose the application under test. It takes a few seconds for the tool to complete the survey and reappear on the screen. The survey results are shown in the DataGrid control of the GUI interface. Now you can double-click the gray or blue area on the left edge or on the top to specify the selected GUI component for an invocation by the GUITesctScript class. 4. Your first GUI action is to manipulate the ListBox. As explained, the value of the GUI text for this ListBox is empty in the first column. You recognize it by reading its class name, WindowsForms10.LISTBOX.app3, in the third column to locate the row index. Double-click beside the row on the left edge. The GUI Test Data Collector form appears on the screen with the GUI controls populated with possible GUI testing and verification information (Figure 8.2). 5. At this point, you can decide which verification method to use for this testing step. For the purpose of simplicity and setting up a testing example, this test will use the specific verifica- tion method. First, make sure the Specific radio button is not checked. In the CheckedList- Box control at the lower-left, check the box beside CSharpAPITextViewer.Form1. Then click the vertical scroll bar downward to locate the txtSelected member and check the box beside it. Now select the Specific radio button. You may see that the selected txtSelected member is entered into the rich text box in the left. The GUI Test Data Collector at this point looks like Figure 8.2. Click the OK button. 6. After the GUI Test Data Collector closes, you are ready to specify the second GUI invoca- tion. From the DataGrid of the Automated GUI Test form, locate the Add button control. Double-click on the left edge of the Add button. The GUI Test Data Collector appears again. All the radio buttons are unchecked. Because the first step specified to verify the txtSelected field, select the Specific radio button again and click the OK button. 4351Book.fm Page 312 Tuesday, September 28, 2004 11:21 AM 313 Enhancing the AutomatedGUITest Tool ➲ FIGURE 8.2 The GUI testing and verification data shown on the GUI Test Data Collector 7. Repeat step 6 four more times by selecting the Copy, RichTextBox, Remove, and Clear controls from the DataGrid. You have specified a total of six steps for this testing case. 8. Next, you need to terminate the C# API Text Viewer. When you click the Run Test button to execute the test, the test script will start up another copy of the application under test, and two copies of the application running on the same system will confuse the tool. 9. Click the Run Test button from the AutomatedGUITest tool. When the save file dialog box appears, type in a filename with an XML extension, such as C:\Temp \TestC#APITextViewer.xml . Then click the Save button. A copy of the verification data is saved as C:\Temp\TestC#APITextViewer_verify.xml at the same time (Listing 8.30). The designated testing starts and the C# API Text Viewer shows up again. The GUI actions of the mouse clicking occur in sequence, and the application closes by itself after the auto- matic testing and verification. Listing 8.30 Members in Need of Verifiation Saved with the C:\Temp \TestC#APITextViewer_verify.xml in Step 9 <?xml version="1.0" encoding="utf-8"?> <TypeVerificationSerializable xmlns:xsd="http://www.w3.org/2001/XMLSchema" ➥xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <AUTPath>C:\GUISourceCode\Chapter03\CSharpAPITextViewer\ ➥bin\Debug\CSharpAPITextViewer.exe</AUTPath> <AUTStartupForm>CSharpAPITextViewer.Form1</AUTStartupForm> <TypeVerificationSerializable> <FormUnderTest> <TypeName>CSharpAPITextViewer.Form1</TypeName> <GUIEvent>lstAvailableFuncs</GUIEvent> 4351Book.fm Page 313 Tuesday, September 28, 2004 11:21 AM 314 Chapter 8 • Methods of GUI Test Verification <TestEvents> <TestAndVerify> <EventMember>lstAvailableFuncs</EventMember> <VerifyingMember>txtSelected</VerifyingMember> <GUIActionSequence>1</GUIActionSequence> <isGUI>false</isGUI> <isField>false</isField> <isProperty>false</isProperty> <ExpectingResult /> <ActualResult /> <ScreenSnapshot /> <ExpectAlphaNumericEqual>true</ExpectAlphaNumericEqual> <AlphanumericPass>true</AlphanumericPass> <ExpectClipBrdEqual>true</ExpectClipBrdEqual> <ClipboardPass>true</ClipboardPass> <FileTestPass>true</FileTestPass> <OjectTestPass>true</OjectTestPass> <ImageTestPass xsi:type="xsd:boolean">true</ImageTestPass> </TestAndVerify> </TestEvents> </FormUnderTest> <FormUnderTest> <TypeName>CSharpAPITextViewer.Form1</TypeName> <GUIEvent>btnAdd</GUIEvent> <TestEvents> <TestAndVerify> <EventMember>btnAdd</EventMember> <VerifyingMember>txtSelected</VerifyingMember> <GUIActionSequence>2</GUIActionSequence> <isGUI>false</isGUI> <isField>false</isField> <isProperty>false</isProperty> <ExpectingResult /> <ActualResult /> <ScreenSnapshot /> <ExpectAlphaNumericEqual>true</ExpectAlphaNumericEqual> <AlphanumericPass>true</AlphanumericPass> <ExpectClipBrdEqual>true</ExpectClipBrdEqual> <ClipboardPass>true</ClipboardPass> <FileTestPass>true</FileTestPass> <OjectTestPass>true</OjectTestPass> <ImageTestPass xsi:type="xsd:boolean">true</ImageTestPass> </TestAndVerify> </TestEvents> </FormUnderTest> <FormUnderTest> <TypeName>CSharpAPITextViewer.Form1</TypeName> <GUIEvent>btnCopy</GUIEvent> <TestEvents> <TestAndVerify> <EventMember>btnCopy</EventMember> <VerifyingMember>txtSelected</VerifyingMember> 4351Book.fm Page 314 Tuesday, September 28, 2004 11:21 AM [...]... of your tool is not limited to the GUI controls covered next They are designed to set up examples so that you can meet all of your future testing requirements Chapter 9 Testing Label and Cosmetic GUI Controls 320 Chapter 9 • Testing Label and Cosmetic GUI Controls n Chapters 7 and 8, we implemented the AutomatedGUITest tool with a test script, a GUI testing data collector, and methods for GUI test verification... the GUI testing and verification information needs to be collected at the time when an application is specified for testing Updating this tool for testing more GUI controls requires adding code to the GUITestVerification, GUITestScript, and GUITestActions classes FIGURE 9.1 Dynamic data-driven execution and interactions between the test script and the data stores GUI Test Script GUI Test Input Data GUI. .. such a tool allows testers to input a lot of testing data and save time by avoiding recording, handwriting, editing, and debugging test scripts The execution of this test script is driven by different GUI controls in an application Figure 9.1 shows 322 Chapter 9 • Testing Label and Cosmetic GUI Controls the data-driven GUI testing process, which involves five components of the AutomatedGUITest tool and... efforts 12 If you want to modify the testing steps and the verification scope, you can modify the testing data store and the verification data store instead of rerunning the testing tool For this demonstration, the testing data store is the TestC#APITextViewer.xml document and the verification data store is the TestC#APITextViewer_verify.xml document Remember, adding more testing steps and more verification... Data GUI Handling Methods from the GUI Test Library GUI Test Verification Data Gets GUIs in need of testing Requests for a GUI handling method Invokes the GUI event Requests for verification information Gets the status of the application after a GUI event Saves the test results Displays the test results Conducts testing and verification interactively Result Store Upgrading the AutomatedGUITest Tool 323... XML documents GUI testing input data and verification data are stored separately Such a separation makes it easy for the testers to create more testing cases or scenarios later by copying, pasting, and editing This data drives the execution of the test script Thus, the AutomatedGUITest tool forms the backbone for a high degree of GUI test automation Based on this backbone, other testing functions can... finding bugs 3 18 Chapter 8 • Methods of GUI Test Verification Summary Throughout the course of this book, you have turned a soulless test monkey into an automatic GUI testing tool This tool has the capabilities of seeing and manipulating the GUI components GUI testing can be conducted by reusing these capabilities in a desired order with simple to complex verifications At this point, the GUI test library... been manufactured with various kinds of GUI controls The nonbusiness functional controls are responsible for decorating the application and providing feedback and instruction to the users Testers are more interested in testing their appearance 324 Chapter 9 • Testing Label and Cosmetic GUI Controls than their business functions For the development of the AutomatedGUITest tool, testing the Label and other... demonstration of these testing tasks Testing Cosmetic GUI Properties In order to validate the newly added methods, we use the AutomatedGUITest tool to test the C# API Text Viewer at the end of each chapter Now, press F5 to build and run the tool Complete the following sections with the new GUI testing data collection and execution Collecting Testing Data While the AutomatedGUITest tool is running, proceed to... functional GUI components tested In the past, we have been pleased by the GUI handling methods of the commercial testing tools This chapter showed how to add more testing methods and demonstrated how to test the Label and GroupBox controls The rest of the book will use a few more examples to add methods handling other specific tasks and make the AutomatedGUITest tool flexible Chapter 10 Testing a TextBox . Label and Cosmetic GUI Controls I n Chapters 7 and 8, we implemented the AutomatedGUITest tool with a test script, a GUI testing data collector, and methods for GUI test verification stores GUI Test Script GUI Test Input Data Conducts testing and verification interactively GUI Handling Methods from the GUI Test Library GUI Test Verification Data Result Store Gets GUIs in. appearance. Even- tually, the appearances of these controls affects usability and attracts end users. Upgrading the AutomatedGUITest Tool The AutomatedGUITest tool uses one test script to test