VS2010测试功能之旅:编码的UI测试(2)-操作动作的录制原理(上)
VS2010测试功能之旅
——编码的UI测试系列之二:操作动作的录制原理(上)
RealZhao,2011年2月18日
回顾
在之前我们介绍了如何用VS2010的UI测试功能创建一个简单的示例,大致描述了如何使用编码的UI测试进行录制和回放,在这章会着重描述VS2010是如何录制操作,并且生成代码,以及初步介绍如何通过自己写代码的方式进行测试。
内容简介
在上一章我们已经介绍过,建立一个编码的UI测试CodedUITest1.cs,录制完成之后,会自动生成一个UIMap1.uitest文件
图1:录制完成后自动生成的UIMap1.uitest文件
事实上,在录制过程中起着关键作用的并非是CodedUITest1.cs,而是UIMap1.uitest,在录制过程中的所有代码都是生成在UIMap1.uitest,所有对于界面的操作,测试的判断也是在UIMap1.uitest文件完成,CodedUITest1.cs仅仅只是调用UIMap1.uitest中的方法(换言之只是个躯壳,编码的UI测试的灵魂还是在UIMap1.uitest)
明白此点之后,接下来我们只需着重研究研究UIMap1.uitest即可,看看他是如何录制并生成代码的
注:这一章的内容可能较之第一章比较难,在阅读的时候可尽量使用VS2010进行操作,便于理解。由于本章内容较长,分为两个部分,上部分介绍原理,下部分介绍通过修改UIMap1.uitest控制操作步骤代码的生成,预计在周六或者周日发出
UIMap的录制与生成
首先我们新建一个测试项目
图2:新建项目
建成之后,(可以看到系统自动默认生成了一个UnitTest.cs,我们可以先将它删除),右击该项目,选择添加à添加新项(注意,不是添加测试,是添加新项),在新项中选择Coded UI Test Map(编码的UI测试映射)
图3:添加编码的UI测试映射
现在我们建立了一个UIMap1.uitest(可以看到这个UIMap1.uitest还没有生成UIMap1.cs和UIMap1.Designer.cs)
图4:UIMap1.uitest
可以双击打开UIMap1.uitest,文件里面没有什么特殊的内容
<?xml version="1.0"?>
<UITest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="" Id="3efe829a-76df-439e-af0d-8d5c62727a1e" AssemblyVersion="10.0.21008.0" Version="1.0" xmlns="http://schemas.microsoft.com/VisualStudio/TeamTest/UITest/2010">
</UITest>
右击该UIMap1.uitest,选则Edit With Coded UI Test Builder(使用编码的UI测试生成器进行编辑),接下来会弹出录制操作用的生成器
图5:Edit With Coded UI Test Builder
我们还是按照上一章中使用的示例程序和操作步骤进行录制四个方法InputErrorUidPwd()、AssertErrorWinow()、InputRightUidPwd()、AssertRightWinow(),(可再添加一个方法CloseWindow(),关闭这个示例程序,上一章没有提到)操作完毕之后,生成代码,我们可以看到UIMap1.cs和UIMap1.Designer.cs已经自动生成,而实际有生成代码的文件为UIMap1.uitest和UIMap1.Designer.cs,UIMap1.cs则为空
现在可以一个个进去看看生成的代码(注:由于录制过程中的操作步骤每个人都可能有细微差别,例如点击坐标,这里我录的示例和大家实验的时候自己录的可能存在一些区别,你懂的)
首先是UIMap1.uitest,大家可以看到这里的代码实在是多得看不清,如果觉得阅读比较困难,可以跳过此段,先看看解释说明,然后再回来看
2 <UITest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="" Id="3efe829a-76df-439e-af0d-8d5c62727a1e" AssemblyVersion="10.0.21008.0" Version="1.0" xmlns="http://schemas.microsoft.com/VisualStudio/TeamTest/UITest/2010">
3 <Configuration>
4 <Group Name="IE">
5 <Setting Name="Version" Value="8.0.6001.18702" WarningLevel="1" />
6 <Setting Name="InformationBar" WarningLevel="1" />
7 <Setting Name="AutoCompletePassword" WarningLevel="1" />
8 <Setting Name="AutoCompleteForm" Value="no" WarningLevel="1" />
9 <Setting Name="DefaultBrowser" Value="IEXPLORE.EXE" WarningLevel="1" />
10 <Setting Name="PopupBlocker" Value="1" WarningLevel="1" />
11 <Setting Name="TabbedBrowsing" Value="0" WarningLevel="2" />
12 <Setting Name="InternetZoneSecurity" Value="66816" WarningLevel="2" />
13 <Setting Name="IntranetZoneSecurity" Value="69632" WarningLevel="2" />
14 <Setting Name="TrustedZoneSecurity" Value="70912" WarningLevel="2" />
15 <Setting Name="RestrictedZoneSecurity" Value="73728" WarningLevel="2" />
16 <Setting Name="PhishingFilter" WarningLevel="1" />
17 <Setting Name="EnhancedSecurityConfiguration" WarningLevel="1" />
18 </Group>
19 <Group Name="OS">
20 <Setting Name="Name" Value="Microsoft Windows XP Professional" WarningLevel="2" />
21 <Setting Name="Version" Value="Microsoft Windows NT 5.1.2600 Service Pack 3" WarningLevel="2" />
22 <Setting Name="IsUserAdmin" Value="True" WarningLevel="2" />
23 <Setting Name="Is64BitOperatingSystem" Value="False" WarningLevel="2" />
24 <Setting Name="IsTerminalServerSession" Value="False" WarningLevel="2" />
25 <Setting Name="OSLanguage" Value="1033" WarningLevel="1" />
26 <Setting Name="UserLocale" Value="1033" WarningLevel="1" />
27 <Setting Name="DragFullWindows" Value="True" WarningLevel="2" />
28 <Setting Name="ScreenResolutionWidth" Value="1440" WarningLevel="2" />
29 <Setting Name="ScreenResolutionHeight" Value="900" WarningLevel="2" />
30 <Setting Name="SystemDPIX" Value="96" WarningLevel="2" />
31 <Setting Name="SystemDPIY" Value="96" WarningLevel="2" />
32 <Setting Name="Aero" WarningLevel="1" />
33 <Setting Name="UACEnabled" WarningLevel="2" />
34 <Setting Name="UACPromptEnabled" WarningLevel="1" />
35 <Setting Name="WindowsAccessibilityAPIVersion" Value="2.0" WarningLevel="1" />
36 </Group>
37 <Group Name="TechnologyManagers">
38 <Setting Name="Web" WarningLevel="1" />
39 <Setting Name="UIA" WarningLevel="1" />
40 </Group>
41 </Configuration>
42 <InitializeActions />
43 <ExecuteActions>
44 <SetValueAction UIObjectName="UIMap1.UI系统登录Window.UITbx_uidWindow.UITbx_uidEdit">
45 <ParameterName />
46 <Value Encoded="false">errorUid</Value>
47 <Type>String</Type>
48 </SetValueAction>
49 <SetValueAction UIObjectName="UIMap1.UI系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit">
50 <ParameterName />
51 <Value Encoded="false">errorPwd</Value>
52 <Type>String</Type>
53 </SetValueAction>
54 <MouseAction UIObjectName="UIMap1.UI系统登录Window.UI登录Window.UI登录Button">
55 <ParameterName />
56 <ModifierKeys>None</ModifierKeys>
57 <IsGlobalHotkey>false</IsGlobalHotkey>
58 <Location X="25" Y="6" />
59 <WheelDirection>0</WheelDirection>
60 <ActionType>Click</ActionType>
61 <MouseButton>Left</MouseButton>
62 </MouseAction>
63 <TestStepMarkerAction MarkerInformation="InputErrorUidPwd">
64 <ParameterName />
65 <StepId>-1</StepId>
66 <Direction>Start</Direction>
67 <Outcome />
68 <Disabled>false</Disabled>
69 <WorkItemId>0</WorkItemId>
70 <MarkerRegionType>Action</MarkerRegionType>
71 </TestStepMarkerAction>
72 <AssertAction UIObjectName="UIMap.UI提示Window.UI用户名或密码错误Window.UI用户名或密码错误Text">
73 <ParameterName />
74 <PropertyName>Exists</PropertyName>
75 <ExpectedValue>True</ExpectedValue>
76 <Type>Boolean</Type>
77 <PropertyCondition>AreEqual</PropertyCondition>
78 </AssertAction>
79 <TestStepMarkerAction MarkerInformation="AssertErrorWinow">
80 <ParameterName />
81 <StepId>-1</StepId>
82 <Direction>Start</Direction>
83 <Outcome />
84 <Disabled>false</Disabled>
85 <WorkItemId>0</WorkItemId>
86 <MarkerRegionType>Assertion</MarkerRegionType>
87 </TestStepMarkerAction>
88 <MouseAction UIObjectName="UIMap1.UI提示Window.UIOKWindow.UIOKButton">
89 <ParameterName />
90 <ModifierKeys>None</ModifierKeys>
91 <IsGlobalHotkey>false</IsGlobalHotkey>
92 <Location X="22" Y="19" />
93 <WheelDirection>0</WheelDirection>
94 <ActionType>Click</ActionType>
95 <MouseButton>Left</MouseButton>
96 </MouseAction>
97 <SetValueAction UIObjectName="UIMap1.UI系统登录Window.UITbx_uidWindow.UITbx_uidEdit">
98 <ParameterName />
99 <Value Encoded="false">Admin</Value>
100 <Type>String</Type>
101 </SetValueAction>
102 <SetValueAction UIObjectName="UIMap1.UI系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit">
103 <ParameterName />
104 <Value Encoded="false">123456</Value>
105 <Type>String</Type>
106 </SetValueAction>
107 <MouseAction UIObjectName="UIMap1.UI系统登录Window.UI登录Window.UI登录Button">
108 <ParameterName />
109 <ModifierKeys>None</ModifierKeys>
110 <IsGlobalHotkey>false</IsGlobalHotkey>
111 <Location X="39" Y="8" />
112 <WheelDirection>0</WheelDirection>
113 <ActionType>Click</ActionType>
114 <MouseButton>Left</MouseButton>
115 </MouseAction>
116 <TestStepMarkerAction MarkerInformation="InputRightUidPwd">
117 <ParameterName />
118 <StepId>-1</StepId>
119 <Direction>Start</Direction>
120 <Outcome />
121 <Disabled>false</Disabled>
122 <WorkItemId>0</WorkItemId>
123 <MarkerRegionType>Action</MarkerRegionType>
124 </TestStepMarkerAction>
125 <AssertAction UIObjectName="UIMap.UI提示Window.UI用户名或密码错误Window.UI登陆成功Text">
126 <ParameterName />
127 <PropertyName>Exists</PropertyName>
128 <ExpectedValue>True</ExpectedValue>
129 <Type>Boolean</Type>
130 <PropertyCondition>AreEqual</PropertyCondition>
131 </AssertAction>
132 <TestStepMarkerAction MarkerInformation="AssertRightWinow">
133 <ParameterName />
134 <StepId>-1</StepId>
135 <Direction>Start</Direction>
136 <Outcome />
137 <Disabled>false</Disabled>
138 <WorkItemId>0</WorkItemId>
139 <MarkerRegionType>Assertion</MarkerRegionType>
140 </TestStepMarkerAction>
141 <MouseAction UIObjectName="UIMap1.UI提示Window.UIOKWindow.UIOKButton">
142 <ParameterName />
143 <ModifierKeys>None</ModifierKeys>
144 <IsGlobalHotkey>false</IsGlobalHotkey>
145 <Location X="28" Y="13" />
146 <WheelDirection>0</WheelDirection>
147 <ActionType>Click</ActionType>
148 <MouseButton>Left</MouseButton>
149 </MouseAction>
150 <MouseAction UIObjectName="UIMap1.UI系统登录Window.UI系统登录TitleBar.UICloseButton">
151 <ParameterName />
152 <ModifierKeys>None</ModifierKeys>
153 <IsGlobalHotkey>false</IsGlobalHotkey>
154 <Location X="9" Y="11" />
155 <WheelDirection>0</WheelDirection>
156 <ActionType>Click</ActionType>
157 <MouseButton>Left</MouseButton>
158 </MouseAction>
159 <TestStepMarkerAction MarkerInformation="CloseWindow">
160 <ParameterName />
161 <StepId>-1</StepId>
162 <Direction>Start</Direction>
163 <Outcome />
164 <Disabled>false</Disabled>
165 <WorkItemId>0</WorkItemId>
166 <MarkerRegionType>Action</MarkerRegionType>
167 </TestStepMarkerAction>
168 </ExecuteActions>
169 <CleanupActions />
170 <OnErrorActions />
171 <Maps>
172 <UIMap Id="UIMap1">
173 <TopLevelWindows>
174 <TopLevelWindow ControlType="Window" Id="UI系统登录Window" FriendlyName="系统登录" SpecialControlType="None" SessionId="154362">
175 <TechnologyName>MSAA</TechnologyName>
176 <WindowTitles>
177 <WindowTitle>系统登录</WindowTitle>
178 </WindowTitles>
179 <SearchConfigurations>
180 <SearchConfiguration>VisibleOnly</SearchConfiguration>
181 </SearchConfigurations>
182 <AndCondition Id="SearchCondition">
183 <PropertyCondition Name="Name">系统登录</PropertyCondition>
184 <PropertyCondition Name="ClassName" Operator="Contains">WindowsForms10.Window</PropertyCondition>
185 <PropertyCondition Name="ControlType">Window</PropertyCondition>
186 </AndCondition>
187 <SupportLevel>0</SupportLevel>
188 <Descendants>
189 <UIObject ControlType="Window" Id="UITbx_uidWindow" FriendlyName="Tbx_uid" SpecialControlType="None">
190 <TechnologyName>MSAA</TechnologyName>
191 <WindowTitles>
192 <WindowTitle>系统登录</WindowTitle>
193 </WindowTitles>
194 <SearchConfigurations>
195 <SearchConfiguration>VisibleOnly</SearchConfiguration>
196 </SearchConfigurations>
197 <AndCondition Id="SearchCondition">
198 <PropertyCondition Name="ControlName">Tbx_uid</PropertyCondition>
199 <PropertyCondition Name="ControlType">Window</PropertyCondition>
200 </AndCondition>
201 <SupportLevel>0</SupportLevel>
202 <Descendants>
203 <UIObject ControlType="Edit" Id="UITbx_uidEdit" FriendlyName="Tbx_uid" SpecialControlType="None">
204 <TechnologyName>MSAA</TechnologyName>
205 <WindowTitles>
206 <WindowTitle>系统登录</WindowTitle>
207 </WindowTitles>
208 <SearchConfigurations>
209 <SearchConfiguration>VisibleOnly</SearchConfiguration>
210 </SearchConfigurations>
211 <AndCondition Id="SearchCondition">
212 <PropertyCondition Name="Name">密码 :</PropertyCondition>
213 <PropertyCondition Name="ControlType">Edit</PropertyCondition>
214 </AndCondition>
215 <SupportLevel>0</SupportLevel>
216 <Descendants />
217 </UIObject>
218 </Descendants>
219 </UIObject>
220 <UIObject ControlType="Window" Id="UITbx_pwdWindow" FriendlyName="Tbx_pwd" SpecialControlType="None">
221 <TechnologyName>MSAA</TechnologyName>
222 <WindowTitles>
223 <WindowTitle>系统登录</WindowTitle>
224 </WindowTitles>
225 <SearchConfigurations>
226 <SearchConfiguration>VisibleOnly</SearchConfiguration>
227 </SearchConfigurations>
228 <AndCondition Id="SearchCondition">
229 <PropertyCondition Name="ControlName">Tbx_pwd</PropertyCondition>
230 <PropertyCondition Name="ControlType">Window</PropertyCondition>
231 </AndCondition>
232 <SupportLevel>0</SupportLevel>
233 <Descendants>
234 <UIObject ControlType="Edit" Id="UITbx_pwdEdit" FriendlyName="Tbx_pwd" SpecialControlType="None">
235 <TechnologyName>MSAA</TechnologyName>
236 <WindowTitles>
237 <WindowTitle>系统登录</WindowTitle>
238 </WindowTitles>
239 <SearchConfigurations>
240 <SearchConfiguration>VisibleOnly</SearchConfiguration>
241 </SearchConfigurations>
242 <AndCondition Id="SearchCondition">
243 <PropertyCondition Name="ControlType">Edit</PropertyCondition>
244 </AndCondition>
245 <SupportLevel>0</SupportLevel>
246 <Descendants />
247 </UIObject>
248 </Descendants>
249 </UIObject>
250 <UIObject ControlType="Window" Id="UI登录Window" FriendlyName="登录" SpecialControlType="None">
251 <TechnologyName>MSAA</TechnologyName>
252 <WindowTitles>
253 <WindowTitle>系统登录</WindowTitle>
254 </WindowTitles>
255 <SearchConfigurations>
256 <SearchConfiguration>VisibleOnly</SearchConfiguration>
257 </SearchConfigurations>
258 <AndCondition Id="SearchCondition">
259 <PropertyCondition Name="ControlName">Btn_Login</PropertyCondition>
260 <PropertyCondition Name="ControlType">Window</PropertyCondition>
261 </AndCondition>
262 <SupportLevel>0</SupportLevel>
263 <Descendants>
264 <UIObject ControlType="Button" Id="UI登录Button" FriendlyName="登录" SpecialControlType="None">
265 <TechnologyName>MSAA</TechnologyName>
266 <WindowTitles>
267 <WindowTitle>系统登录</WindowTitle>
268 </WindowTitles>
269 <SearchConfigurations>
270 <SearchConfiguration>VisibleOnly</SearchConfiguration>
271 </SearchConfigurations>
272 <AndCondition Id="SearchCondition">
273 <PropertyCondition Name="Name">登录</PropertyCondition>
274 <PropertyCondition Name="ControlType">Button</PropertyCondition>
275 </AndCondition>
276 <SupportLevel>0</SupportLevel>
277 <Descendants />
278 </UIObject>
279 </Descendants>
280 </UIObject>
281 <UIObject ControlType="TitleBar" Id="UI系统登录TitleBar" FriendlyName="系统登录" SpecialControlType="None">
282 <TechnologyName>MSAA</TechnologyName>
283 <WindowTitles>
284 <WindowTitle>系统登录</WindowTitle>
285 </WindowTitles>
286 <SearchConfigurations>
287 <SearchConfiguration>VisibleOnly</SearchConfiguration>
288 </SearchConfigurations>
289 <AndCondition Id="SearchCondition">
290 <PropertyCondition Name="ControlType">TitleBar</PropertyCondition>
291 </AndCondition>
292 <SupportLevel>0</SupportLevel>
293 <Descendants>
294 <UIObject ControlType="Button" Id="UICloseButton" FriendlyName="Close" SpecialControlType="None">
295 <TechnologyName>MSAA</TechnologyName>
296 <WindowTitles>
297 <WindowTitle>系统登录</WindowTitle>
298 </WindowTitles>
299 <SearchConfigurations>
300 <SearchConfiguration>VisibleOnly</SearchConfiguration>
301 </SearchConfigurations>
302 <AndCondition Id="SearchCondition">
303 <PropertyCondition Name="Name">Close</PropertyCondition>
304 <PropertyCondition Name="ControlType">Button</PropertyCondition>
305 </AndCondition>
306 <SupportLevel>0</SupportLevel>
307 <Descendants />
308 </UIObject>
309 </Descendants>
310 </UIObject>
311 </Descendants>
312 </TopLevelWindow>
313 <TopLevelWindow ControlType="Window" Id="UI提示Window" FriendlyName="提示" SpecialControlType="None" SessionId="1203022">
314 <TechnologyName>MSAA</TechnologyName>
315 <WindowTitles>
316 <WindowTitle>提示</WindowTitle>
317 </WindowTitles>
318 <SearchConfigurations>
319 <SearchConfiguration>VisibleOnly</SearchConfiguration>
320 </SearchConfigurations>
321 <AndCondition Id="SearchCondition">
322 <PropertyCondition Name="Name">提示</PropertyCondition>
323 <PropertyCondition Name="ClassName">#32770</PropertyCondition>
324 <PropertyCondition Name="ControlType">Window</PropertyCondition>
325 </AndCondition>
326 <SupportLevel>1</SupportLevel>
327 <Descendants>
328 <UIObject ControlType="Window" Id="UI用户名或密码错误Window" FriendlyName="用户名或密码错误!" SpecialControlType="None">
329 <TechnologyName>MSAA</TechnologyName>
330 <WindowTitles>
331 <WindowTitle>提示</WindowTitle>
332 </WindowTitles>
333 <SearchConfigurations>
334 <SearchConfiguration>VisibleOnly</SearchConfiguration>
335 </SearchConfigurations>
336 <AndCondition Id="SearchCondition">
337 <PropertyCondition Name="ControlId">65535</PropertyCondition>
338 <PropertyCondition Name="ControlType">Window</PropertyCondition>
339 </AndCondition>
340 <SupportLevel>1</SupportLevel>
341 <Descendants>
342 <UIObject ControlType="Text" Id="UI用户名或密码错误Text" FriendlyName="用户名或密码错误!" SpecialControlType="None">
343 <TechnologyName>MSAA</TechnologyName>
344 <WindowTitles>
345 <WindowTitle>提示</WindowTitle>
346 </WindowTitles>
347 <SearchConfigurations>
348 <SearchConfiguration>VisibleOnly</SearchConfiguration>
349 </SearchConfigurations>
350 <AndCondition Id="SearchCondition">
351 <PropertyCondition Name="Name">用户名或密码错误!</PropertyCondition>
352 <PropertyCondition Name="ControlType">Text</PropertyCondition>
353 </AndCondition>
354 <SupportLevel>1</SupportLevel>
355 <Descendants />
356 </UIObject>
357 <UIObject ControlType="Text" Id="UI登陆成功Text" FriendlyName="登陆成功!" SpecialControlType="None">
358 <TechnologyName>MSAA</TechnologyName>
359 <WindowTitles>
360 <WindowTitle>提示</WindowTitle>
361 </WindowTitles>
362 <SearchConfigurations>
363 <SearchConfiguration>VisibleOnly</SearchConfiguration>
364 </SearchConfigurations>
365 <AndCondition Id="SearchCondition">
366 <PropertyCondition Name="Name">登陆成功!</PropertyCondition>
367 <PropertyCondition Name="ControlType">Text</PropertyCondition>
368 </AndCondition>
369 <SupportLevel>1</SupportLevel>
370 <Descendants />
371 </UIObject>
372 </Descendants>
373 </UIObject>
374 <UIObject ControlType="Window" Id="UIOKWindow" FriendlyName="OK" SpecialControlType="None">
375 <TechnologyName>MSAA</TechnologyName>
376 <WindowTitles>
377 <WindowTitle>提示</WindowTitle>
378 </WindowTitles>
379 <SearchConfigurations>
380 <SearchConfiguration>VisibleOnly</SearchConfiguration>
381 </SearchConfigurations>
382 <AndCondition Id="SearchCondition">
383 <PropertyCondition Name="ControlId">2</PropertyCondition>
384 <PropertyCondition Name="ControlType">Window</PropertyCondition>
385 </AndCondition>
386 <SupportLevel>0</SupportLevel>
387 <Descendants>
388 <UIObject ControlType="Button" Id="UIOKButton" FriendlyName="OK" SpecialControlType="None">
389 <TechnologyName>MSAA</TechnologyName>
390 <WindowTitles>
391 <WindowTitle>提示</WindowTitle>
392 </WindowTitles>
393 <SearchConfigurations>
394 <SearchConfiguration>VisibleOnly</SearchConfiguration>
395 </SearchConfigurations>
396 <AndCondition Id="SearchCondition">
397 <PropertyCondition Name="Name">OK</PropertyCondition>
398 <PropertyCondition Name="ControlType">Button</PropertyCondition>
399 </AndCondition>
400 <SupportLevel>0</SupportLevel>
401 <Descendants />
402 </UIObject>
403 </Descendants>
404 </UIObject>
405 </Descendants>
406 </TopLevelWindow>
407 </TopLevelWindows>
408 </UIMap>
409 </Maps>
410 <ValueMap>
411 <ParameterList />
412 </ValueMap>
413 </UITest>
其实UIMap1.uitest这个XML的文件结构如下
<UITest>
<Configuration>… </Configuration>
<InitializeActions>…</InitializeActions>
<ExecuteActions>…</ExecuteActions>
<CleanupActions>…</CleanupActions>
<OnErrorActions>…</OnErrorActions>
<Maps>…</Maps>
<ValueMap>…</ValueMap>
</UITest>
这里做一个简单的说明:
Configuration:是对环境进行一个描述和配置,对测试几乎没有影响,可以忽略
InitializeActions,ExecuteActions,CleanupActions,OnErrorAction:其中InitializeActions指初始化需要执行的操作,ExecuteActions指测试过程中的操作(目前我们所通过录制所生成的操作都默认放在ExecuteActions,大家现在可以回过去仔细看看ExecuteActions节点的内容),CleanupActions指测试完毕需要清理资源的Actions,而OnErrorAction则指代异常处理Actions
Maps:是我们需要关注的对象库,我们操作过程中所识别的所有控件都是会存放到这里的,对象识别我会在第三章的时候提及
ValueMap:是值映射,类似于参数记载,实际功能也不是特别大
在这些节点中,真正起到实际作用的是Actions和Maps
之后我们再来查看UIMap1.Designer.cs,同样,觉得会看晕的可直接跳过,之后回来再看
2 // <auto-generated>
3 // This code was generated by coded UI test builder.
4 // Version: 10.0.0.0
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 // ------------------------------------------------------------------------------
10
11 namespace TestProject1.UIMap1Classes
12 {
13 using System;
14 using System.CodeDom.Compiler;
15 using System.Collections.Generic;
16 using System.Drawing;
17 using System.Text.RegularExpressions;
18 using System.Windows.Input;
19 using Microsoft.VisualStudio.TestTools.UITest.Extension;
20 using Microsoft.VisualStudio.TestTools.UITesting;
21 using Microsoft.VisualStudio.TestTools.UITesting.WinControls;
22 using Microsoft.VisualStudio.TestTools.UnitTesting;
23 using Keyboard = Microsoft.VisualStudio.TestTools.UITesting.Keyboard;
24 using Mouse = Microsoft.VisualStudio.TestTools.UITesting.Mouse;
25 using MouseButtons = System.Windows.Forms.MouseButtons;
26
27
28 [GeneratedCode("Coded UITest Builder", "10.0.30319.1")]
29 public partial class UIMap1
30 {
31
32 /// <summary>
33 /// InputErrorUidPwd - Use 'InputErrorUidPwdParams' to pass parameters into this method.
34 /// </summary>
35 public void InputErrorUidPwd()
36 {
37 #region Variable Declarations
38 WinEdit uITbx_uidEdit = this.UI系统登录Window.UITbx_uidWindow.UITbx_uidEdit;
39 WinEdit uITbx_pwdEdit = this.UI系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit;
40 WinButton uI登录Button = this.UI系统登录Window.UI登录Window.UI登录Button;
41 #endregion
42
43 // Type 'errorUid' in 'Tbx_uid' text box
44 uITbx_uidEdit.Text = this.InputErrorUidPwdParams.UITbx_uidEditText;
45
46 // Type 'errorPwd' in 'Tbx_pwd' text box
47 uITbx_pwdEdit.Text = this.InputErrorUidPwdParams.UITbx_pwdEditText;
48
49 // Click '登录' button
50 Mouse.Click(uI登录Button, new Point(25, 6));
51 }
52
53 /// <summary>
54 /// AssertErrorWinow - Use 'AssertErrorWinowExpectedValues' to pass parameters into this method.
55 /// </summary>
56 public void AssertErrorWinow()
57 {
58 #region Variable Declarations
59 WinText uI用户名或密码错误Text = this.UI提示Window.UI用户名或密码错误Window.UI用户名或密码错误Text;
60 #endregion
61
62 // Verify that '用户名或密码错误!' label's property 'Exists' equals 'True'
63 Assert.AreEqual(this.AssertErrorWinowExpectedValues.UI用户名或密码错误TextExists, uI用户名或密码错误Text.Exists);
64 }
65
66 /// <summary>
67 /// InputRightUidPwd - Use 'InputRightUidPwdParams' to pass parameters into this method.
68 /// </summary>
69 public void InputRightUidPwd()
70 {
71 #region Variable Declarations
72 WinButton uIOKButton = this.UI提示Window.UIOKWindow.UIOKButton;
73 WinEdit uITbx_uidEdit = this.UI系统登录Window.UITbx_uidWindow.UITbx_uidEdit;
74 WinEdit uITbx_pwdEdit = this.UI系统登录Window.UITbx_pwdWindow.UITbx_pwdEdit;
75 WinButton uI登录Button = this.UI系统登录Window.UI登录Window.UI登录Button;
76 #endregion
77
78 // Click 'OK' button
79 Mouse.Click(uIOKButton, new Point(22, 19));
80
81 // Type 'Admin' in 'Tbx_uid' text box
82 uITbx_uidEdit.Text = this.InputRightUidPwdParams.UITbx_uidEditText;
83
84 // Type '123456' in 'Tbx_pwd' text box
85 uITbx_pwdEdit.Text = this.InputRightUidPwdParams.UITbx_pwdEditText;
86
87 // Click '登录' button
88 Mouse.Click(uI登录Button, new Point(39, 8));
89 }
90
91 /// <summary>
92 /// AssertRightWinow - Use 'AssertRightWinowExpectedValues' to pass parameters into this method.
93 /// </summary>
94 public void AssertRightWinow()
95 {
96 #region Variable Declarations
97 WinText uI登陆成功Text = this.UI提示Window.UI用户名或密码错误Window.UI登陆成功Text;
98 #endregion
99
100 // Verify that '登陆成功!' label's property 'Exists' equals 'True'
101 Assert.AreEqual(this.AssertRightWinowExpectedValues.UI登陆成功TextExists, uI登陆成功Text.Exists);
102 }
103
104 /// <summary>
105 /// CloseWindow
106 /// </summary>
107 public void CloseWindow()
108 {
109 #region Variable Declarations
110 WinButton uIOKButton = this.UI提示Window.UIOKWindow.UIOKButton;
111 WinButton uICloseButton = this.UI系统登录Window.UI系统登录TitleBar.UICloseButton;
112 #endregion
113
114 // Click 'OK' button
115 Mouse.Click(uIOKButton, new Point(28, 13));
116
117 // Click 'Close' button
118 Mouse.Click(uICloseButton, new Point(9, 11));
119 }
120
121 #region Properties
122 public virtual InputErrorUidPwdParams InputErrorUidPwdParams
123 {
124 get
125 {
126 if ((this.mInputErrorUidPwdParams == null))
127 {
128 this.mInputErrorUidPwdParams = new InputErrorUidPwdParams();
129 }
130 return this.mInputErrorUidPwdParams;
131 }
132 }
133
134 public virtual AssertErrorWinowExpectedValues AssertErrorWinowExpectedValues
135 {
136 get
137 {
138 if ((this.mAssertErrorWinowExpectedValues == null))
139 {
140 this.mAssertErrorWinowExpectedValues = new AssertErrorWinowExpectedValues();
141 }
142 return this.mAssertErrorWinowExpectedValues;
143 }
144 }
145
146 public virtual InputRightUidPwdParams InputRightUidPwdParams
147 {
148 get
149 {
150 if ((this.mInputRightUidPwdParams == null))
151 {
152 this.mInputRightUidPwdParams = new InputRightUidPwdParams();
153 }
154 return this.mInputRightUidPwdParams;
155 }
156 }
157
158 public virtual AssertRightWinowExpectedValues AssertRightWinowExpectedValues
159 {
160 get
161 {
162 if ((this.mAssertRightWinowExpectedValues == null))
163 {
164 this.mAssertRightWinowExpectedValues = new AssertRightWinowExpectedValues();
165 }
166 return this.mAssertRightWinowExpectedValues;
167 }
168 }
169
170 public UI系统登录Window UI系统登录Window
171 {
172 get
173 {
174 if ((this.mUI系统登录Window == null))
175 {
176 this.mUI系统登录Window = new UI系统登录Window();
177 }
178 return this.mUI系统登录Window;
179 }
180 }
181
182 public UI提示Window UI提示Window
183 {
184 get
185 {
186 if ((this.mUI提示Window == null))
187 {
188 this.mUI提示Window = new UI提示Window();
189 }
190 return this.mUI提示Window;
191 }
192 }
193 #endregion
194
195 #region Fields
196 private InputErrorUidPwdParams mInputErrorUidPwdParams;
197
198 private AssertErrorWinowExpectedValues mAssertErrorWinowExpectedValues;
199
200 private InputRightUidPwdParams mInputRightUidPwdParams;
201
202 private AssertRightWinowExpectedValues mAssertRightWinowExpectedValues;
203
204 private UI系统登录Window mUI系统登录Window;
205
206 private UI提示Window mUI提示Window;
207 #endregion
208 }
209
210 /// <summary>
211 /// Parameters to be passed into 'InputErrorUidPwd'
212 /// </summary>
213 [GeneratedCode("Coded UITest Builder", "10.0.30319.1")]
214 public class InputErrorUidPwdParams
215 {
216
217 #region Fields
218 /// <summary>
219 /// Type 'errorUid' in 'Tbx_uid' text box
220 /// </summary>
221 public string UITbx_uidEditText = "errorUid";
222
223 /// <summary>
224 /// Type 'errorPwd' in 'Tbx_pwd' text box
225 /// </summary>
226 public string UITbx_pwdEditText = "errorPwd";
227 #endregion
228 }
229
230 /// <summary>
231 /// Parameters to be passed into 'AssertErrorWinow'
232 /// </summary>
233 [GeneratedCode("Coded UITest Builder", "10.0.30319.1")]
234 public class AssertErrorWinowExpectedValues
235 {
236
237 #region Fields
238 /// <summary>
239 /// Verify that '用户名或密码错误!' label's property 'Exists' equals 'True'
240 /// </summary>
241 public bool UI用户名或密码错误TextExists = true;
242 #endregion
243 }
244
245 /// <summary>
246 /// Parameters to be passed into 'InputRightUidPwd'
247 /// </summary>
248 [GeneratedCode("Coded UITest Builder", "10.0.30319.1")]
249 public class InputRightUidPwdParams
250 {
251
252 #region Fields
253 /// <summary>
254 /// Type 'Admin' in 'Tbx_uid' text box
255 /// </summary>
256 public string UITbx_uidEditText = "Admin";
257
258 /// <summary>
259 /// Type '123456' in 'Tbx_pwd' text box
260 /// </summary>
261 public string UITbx_pwdEditText = "123456";
262 #endregion
263 }
264
265 /// <summary>
266 /// Parameters to be passed into 'AssertRightWinow'
267 /// </summary>
268 [GeneratedCode("Coded UITest Builder", "10.0.30319.1")]
269 public class AssertRightWinowExpectedValues
270 {
271
272 #region Fields
273 /// <summary>
274 /// Verify that '登陆成功!' label's property 'Exists' equals 'True'
275 /// </summary>
276 public bool UI登陆成功TextExists = true;
277 #endregion
278 }
279
280 [GeneratedCode("Coded UITest Builder", "10.0.30319.1")]
281 public class UI系统登录Window : WinWindow
282 {
283
284 public UI系统登录Window()
285 {
286 #region Search Criteria
287 this.SearchProperties[WinWindow.PropertyNames.Name] = "系统登录";
288 this.SearchProperties.Add(new PropertyExpression(WinWindow.PropertyNames.ClassName, "WindowsForms10.Window", PropertyExpressionOperator.Contains));
289 this.WindowTitles.Add("系统登录");
290 #endregion
291 }
292
293 #region Properties
294 public UITbx_uidWindow UITbx_uidWindow
295 {
296 get
297 {
298 if ((this.mUITbx_uidWindow == null))
299 {
300 this.mUITbx_uidWindow = new UITbx_uidWindow(this);
301 }
302 return this.mUITbx_uidWindow;
303 }
304 }
305
306 public UITbx_pwdWindow UITbx_pwdWindow
307 {
308 get
309 {
310 if ((this.mUITbx_pwdWindow == null))
311 {
312 this.mUITbx_pwdWindow = new UITbx_pwdWindow(this);
313 }
314 return this.mUITbx_pwdWindow;
315 }
316 }
317
318 public UI登录Window UI登录Window
319 {
320 get
321 {
322 if ((this.mUI登录Window == null))
323 {
324 this.mUI登录Window = new UI登录Window(this);
325 }
326 return this.mUI登录Window;
327 }
328 }
329
330 public UI系统登录TitleBar UI系统登录TitleBar
331 {
332 get
333 {
334 if ((this.mUI系统登录TitleBar == null))
335 {
336 this.mUI系统登录TitleBar = new UI系统登录TitleBar(this);
337 }
338 return this.mUI系统登录TitleBar;
339 }
340 }
341 #endregion
342
343 #region Fields
344 private UITbx_uidWindow mUITbx_uidWindow;
345
346 private UITbx_pwdWindow mUITbx_pwdWindow;
347
348 private UI登录Window mUI登录Window;
349
350 private UI系统登录TitleBar mUI系统登录TitleBar;
351 #endregion
352 }
353
354 [GeneratedCode("Coded UITest Builder", "10.0.30319.1")]
355 public class UITbx_uidWindow : WinWindow
356 {
357
358 public UITbx_uidWindow(UITestControl searchLimitContainer) :
359 base(searchLimitContainer)
360 {
361 #region Search Criteria
362 this.SearchProperties[WinWindow.PropertyNames.ControlName] = "Tbx_uid";
363 this.WindowTitles.Add("系统登录");
364 #endregion
365 }
366
367 #region Properties
368 public WinEdit UITbx_uidEdit
369 {
370 get
371 {
372 if ((this.mUITbx_uidEdit == null))
373 {
374 this.mUITbx_uidEdit = new WinEdit(this);
375 #region Search Criteria
376 this.mUITbx_uidEdit.SearchProperties[WinEdit.PropertyNames.Name] = "密码 :";
377 this.mUITbx_uidEdit.WindowTitles.Add("系统登录");
378 #endregion
379 }
380 return this.mUITbx_uidEdit;
381 }
382 }
383 #endregion
384
385 #region Fields
386 private WinEdit mUITbx_uidEdit;
387 #endregion
388 }
389
390 [GeneratedCode("Coded UITest Builder", "10.0.30319.1")]
391 public class UITbx_pwdWindow : WinWindow
392 {
393
394 public UITbx_pwdWindow(UITestControl searchLimitContainer) :
395 base(searchLimitContainer)
396 {
397 #region Search Criteria
398 this.SearchProperties[WinWindow.PropertyNames.ControlName] = "Tbx_pwd";
399 this.WindowTitles.Add("系统登录");
400 #endregion
401 }
402
403 #region Properties
404 public WinEdit UITbx_pwdEdit
405 {
406 get
407 {
408 if ((this.mUITbx_pwdEdit == null))
409 {
410 this.mUITbx_pwdEdit = new WinEdit(this);
411 #region Search Criteria
412 this.mUITbx_pwdEdit.WindowTitles.Add("系统登录");
413 #endregion
414 }
415 return this.mUITbx_pwdEdit;
416 }
417 }
418 #endregion
419
420 #region Fields
421 private WinEdit mUITbx_pwdEdit;
422 #endregion
423 }
424
425 [GeneratedCode("Coded UITest Builder", "10.0.30319.1")]
426 public class UI登录Window : WinWindow
427 {
428
429 public UI登录Window(UITestControl searchLimitContainer) :
430 base(searchLimitContainer)
431 {
432 #region Search Criteria
433 this.SearchProperties[WinWindow.PropertyNames.ControlName] = "Btn_Login";
434 this.WindowTitles.Add("系统登录");
435 #endregion
436 }
437
438 #region Properties
439 public WinButton UI登录Button
440 {
441 get
442 {
443 if ((this.mUI登录Button == null))
444 {
445 this.mUI登录Button = new WinButton(this);
446 #region Search Criteria
447 this.mUI登录Button.SearchProperties[WinButton.PropertyNames.Name] = "登录";
448 this.mUI登录Button.WindowTitles.Add("系统登录");
449 #endregion
450 }
451 return this.mUI登录Button;
452 }
453 }
454 #endregion
455
456 #region Fields
457 private WinButton mUI登录Button;
458 #endregion
459 }
460
461 [GeneratedCode("Coded UITest Builder", "10.0.30319.1")]
462 public class UI系统登录TitleBar : WinTitleBar
463 {
464
465 public UI系统登录TitleBar(UITestControl searchLimitContainer) :
466 base(searchLimitContainer)
467 {
468 #region Search Criteria
469 this.WindowTitles.Add("系统登录");
470 #endregion
471 }
472
473 #region Properties
474 public WinButton UICloseButton
475 {
476 get
477 {
478 if ((this.mUICloseButton == null))
479 {
480 this.mUICloseButton = new WinButton(this);
481 #region Search Criteria
482 this.mUICloseButton.SearchProperties[WinButton.PropertyNames.Name] = "Close";
483 this.mUICloseButton.WindowTitles.Add("系统登录");
484 #endregion
485 }
486 return this.mUICloseButton;
487 }
488 }
489 #endregion
490
491 #region Fields
492 private WinButton mUICloseButton;
493 #endregion
494 }
495
496 [GeneratedCode("Coded UITest Builder", "10.0.30319.1")]
497 public class UI提示Window : WinWindow
498 {
499
500 public UI提示Window()
501 {
502 #region Search Criteria
503 this.SearchProperties[WinWindow.PropertyNames.Name] = "提示";
504 this.SearchProperties[WinWindow.PropertyNames.ClassName] = "#32770";
505 this.WindowTitles.Add("提示");
506 #endregion
507 }
508
509 #region Properties
510 public UI用户名或密码错误Window UI用户名或密码错误Window
511 {
512 get
513 {
514 if ((this.mUI用户名或密码错误Window == null))
515 {
516 this.mUI用户名或密码错误Window = new UI用户名或密码错误Window(this);
517 }
518 return this.mUI用户名或密码错误Window;
519 }
520 }
521
522 public UIOKWindow UIOKWindow
523 {
524 get
525 {
526 if ((this.mUIOKWindow == null))
527 {
528 this.mUIOKWindow = new UIOKWindow(this);
529 }
530 return this.mUIOKWindow;
531 }
532 }
533 #endregion
534
535 #region Fields
536 private UI用户名或密码错误Window mUI用户名或密码错误Window;
537
538 private UIOKWindow mUIOKWindow;
539 #endregion
540 }
541
542 [GeneratedCode("Coded UITest Builder", "10.0.30319.1")]
543 public class UI用户名或密码错误Window : WinWindow
544 {
545
546 public UI用户名或密码错误Window(UITestControl searchLimitContainer) :
547 base(searchLimitContainer)
548 {
549 #region Search Criteria
550 this.SearchProperties[WinWindow.PropertyNames.ControlId] = "65535";
551 this.WindowTitles.Add("提示");
552 #endregion
553 }
554
555 #region Properties
556 public WinText UI用户名或密码错误Text
557 {
558 get
559 {
560 if ((this.mUI用户名或密码错误Text == null))
561 {
562 this.mUI用户名或密码错误Text = new WinText(this);
563 #region Search Criteria
564 this.mUI用户名或密码错误Text.SearchProperties[WinText.PropertyNames.Name] = "用户名或密码错误!";
565 this.mUI用户名或密码错误Text.WindowTitles.Add("提示");
566 #endregion
567 }
568 return this.mUI用户名或密码错误Text;
569 }
570 }
571
572 public WinText UI登陆成功Text
573 {
574 get
575 {
576 if ((this.mUI登陆成功Text == null))
577 {
578 this.mUI登陆成功Text = new WinText(this);
579 #region Search Criteria
580 this.mUI登陆成功Text.SearchProperties[WinText.PropertyNames.Name] = "登陆成功!";
581 this.mUI登陆成功Text.WindowTitles.Add("提示");
582 #endregion
583 }
584 return this.mUI登陆成功Text;
585 }
586 }
587 #endregion
588
589 #region Fields
590 private WinText mUI用户名或密码错误Text;
591
592 private WinText mUI登陆成功Text;
593 #endregion
594 }
595
596 [GeneratedCode("Coded UITest Builder", "10.0.30319.1")]
597 public class UIOKWindow : WinWindow
598 {
599
600 public UIOKWindow(UITestControl searchLimitContainer) :
601 base(searchLimitContainer)
602 {
603 #region Search Criteria
604 this.SearchProperties[WinWindow.PropertyNames.ControlId] = "2";
605 this.WindowTitles.Add("提示");
606 #endregion
607 }
608
609 #region Properties
610 public WinButton UIOKButton
611 {
612 get
613 {
614 if ((this.mUIOKButton == null))
615 {
616 this.mUIOKButton = new WinButton(this);
617 #region Search Criteria
618 this.mUIOKButton.SearchProperties[WinButton.PropertyNames.Name] = "OK";
619 this.mUIOKButton.WindowTitles.Add("提示");
620 #endregion
621 }
622 return this.mUIOKButton;
623 }
624 }
625 #endregion
626
627 #region Fields
628 private WinButton mUIOKButton;
629 #endregion
630 }
631 }
632
UIMap1.Designer.cs这个文件结构如下
图6:UIMap1.Designer.cs
我们可以用UIMap1.uitest上的内容和UIMap1.Designer.cs上的内容做个对比,可以明显的发现他们之间有一定的对应性,那么疑问就产生了,我们在录制的时候,究竟先生成UIMap1.uitest还是UIMap1.Designer.cs?在对界面操作的代码中,他们哪个起作用?
为了说明这个,就得提到编码的UI测试操作步骤的录制原理,这里会按步骤说明:
(1) 首先我们打开了录制生成器
(2) 使用录制生成器录制操作,对于每一个操作动作,录制生成器会根据你所进行的操作,解析被操作的对象(控件),并分析操作动作,并将对象(控件)的关键标识属性和操作动作按录制顺序存放在内存中
(3) 停止录制
(4) 点击“生成代码”按钮,录制生成器会读取之前放在内存中的对象(控件)的关键标识属性和操作动作按XML的形式存放在UIMap1.uitest里
(5) 之后代码生成器通过解析UIMap1.uitest,再生成UIMap1.Designer.cs
然后进行回放的时候,真正在起作用其实的是UIMap1.Designer.cs,UIMap1.uitest的作用仅仅是用于生成UIMap1.Designer.cs
我想介绍到这里很多曾经使用过VS2010编码UI测试的朋友应该明白了,为什么自己在UIMap1.Designer.cs添加或者删除的代码,在打开录制生成器之后,重新点击“生成代码”,之前的修改就消失了,原因就是因为UIMap1.Designer.cs里面的代码是根据UIMap1.uitest生成的
因此,如果要想编写自定义代码,可以通过两种途径
(1)通过修改UIMap1.uitest来控制UIMap1.Designer.cs代码的生成
(2)将代码写到非UIMap1.Designer.cs文件的其他地方
在本章的第二部分,将介绍如何通过修改UIMap1.uitest来控制UIMap1.Designer.cs代码的生成,预计可能在本周六或者周日发布,敬请关注~
PS:如何调用UIMap1.Designer.cs中的方法,这个时候可以新建一个CodedUItest.cs,取消录制,写一个这样的调用即可
[TestMethod]
public void CodedUITestMethod1()
{
UIMap1Classes.UIMap1 uimap1 = new UIMap1Classes.UIMap1();
uimap1.InputErrorUidPwd();
uimap1.AssertErrorWinow();
uimap1.InputRightUidPwd();
uimap1.AssertRightWinow();
uimap1.CloseWindow();
}
附:发布计划
编码的UI测试系列之一:入门篇 一个简单的示例(Released)
编码的UI测试系列之二:入门篇 操作动作的录制原理(上)(Released)
编码的UI测试系列之二:入门篇 操作动作的录制原理(下)(Released)
编码的UI测试系列之三:入门篇 操作对象的识别原理 (Released)
编码的UI测试系列之四:进阶篇 通过编写测试代码的方式建立UI测试(上)(Released)
编码的UI测试系列之四:进阶篇 通过编写测试代码的方式建立UI测试(下)(Released)
编码的UI测试系列之五:进阶篇 常用测试要点和函数(1)
编码的UI测试系列之六:进阶篇 常用测试要点和函数(2)
编码的UI测试系列之七:进阶篇 UI测试之间的互相引用和测试组织
编码的UI测试系列之八:高级篇 远程调用其他机器进行测试
编码的UI测试系列之九:高级篇 使用MS测试管理器组织测试