UI 自动化 测试库
UI 自动化测试库 (UIA 测试库) 是驱动程序应用程序在自动测试方案中调用的 API。 驱动程序是从需要验证的控件中获取自动化元素 (IUIAutomationElement 对象) ,并将其提供给UI 自动化测试库的应用程序。 然后,测试库检查并验证UI 自动化实现。 若要详细了解UI 自动化和自动化元素,请参阅UI 自动化基础知识。
UI 自动化测试库工作流
下图显示了一个测试工作流,该工作流通过使用控制台应用程序作为驱动程序合并了 UI 自动化 测试库。 在这种情况下,驱动程序启动 Notepad.exe 实例并获取自动化元素 (,即从编辑控件) 的 IUIAutomationElement 对象。 接下来,驱动程序基于要测试的 UI 平台创建UI 自动化测试库对象,然后将自动化元素作为参数传入。 UI 自动化测试库确定自动化元素是文档控件类型,然后执行文档控件测试、文本和滚动控件模式测试和通用自动化元素测试。
使用 UI 自动化 测试库进行日志记录
UI 自动化测试库使用外部 DLL 来记录测试运行的结果。 它支持以 XML 的形式进行日志记录和记录到控制台。
XML 日志记录
XML 日志记录通常由 Visual UI 自动化 Verify 使用,但它也可以合并到命令行工作流中。
如果指定了 XML 日志记录,驱动程序应用程序必须通过创建 XmlWriter 对象并将其传递给 XmlLog.GetTestRunXml 方法来序列化输出。 然后,驱动程序可以在内部使用序列化的 XML,或将其写入文件。
XML 日志记录需要以下 DLL。
- WUIALogging.dll
- WUIALoggerXml.dll
控制台日志记录
默认情况下,UI 自动化测试库使用控制台日志记录,其中所有日志记录输出都以纯文本形式通过管道传送到控制台窗口。 控制台日志记录需要WUIALogging.dll。
日志记录的代码要求
驱动程序应用程序必须包含以下代码片段才能使用UI 自动化测试库日志记录。
\\ Include logging functionality.
using Microsoft.Test.UIAutomation.Logging;
...
\\ Select a logger.
UIAVerifyLogger.SetLoggerType(LogTypes.DefaultLogger |
LogTypes.ConsoleLogger |
LogTypes.XmlLogger);
...
\\ Output comment to selected logger.
UIAVerifyLogger.LogComment("...");
日志记录示例
以下示例演示基本的日志记录功能,并演示如何在基本测试自动化驱动程序应用程序中使用 UI 自动化 测试库 API。
//---------------------------------------------------------------------------
//
// Description: Sample logger.
//
//---------------------------------------------------------------------------
using System;
namespace WUITest
{
using Microsoft.Test.UIAutomation.Logging;
public sealed class TestMain
{
private TestMain() { }
/// -----------------------------------------------------------------
/// <summary>
/// Entry point
/// </summary>
/// -----------------------------------------------------------------
[STAThread]
static void Main(string[] args)
{
// Call SetLogger() if you don't want to use the default logger.
// To set the logger type, call SetLogger(<string>).
// <string> can be specified from the command line or from the
// the UI Automation Test Library enumeration:
//
// Logger.SetLogger(LogTypes.ConsoleLogger);
// Logger.SetLogger(LogTypes.DefaultLogger);
Logger.SetLogger(LogTypes.DefaultLogger);
Logger.StartTest("Test 1");
Logger.LogComment("This is a comment");
Logger.LogError(new Exception("My error"), false);
Logger.EndTest();
Logger.StartTest("Test 2");
Logger.LogComment("This is a second comment");
Logger.LogPass();
Logger.EndTest();
Logger.ReportResults();
}
}
}
//---------------------------------------------------------------------------
//
// Description: Sample test automation.
//
//---------------------------------------------------------------------------
using System;
using System.Windows;
namespace WUITest
{
using System.Diagnostics;
using System.Threading;
using System.Windows.Automation;
using Microsoft.Test.UIAutomation;
using Microsoft.Test.UIAutomation.Core;
using Microsoft.Test.UIAutomation.TestManager;
using Microsoft.Test.UIAutomation.Tests.Controls;
using Microsoft.Test.UIAutomation.Tests.Patterns;
using Microsoft.Test.UIAutomation.Tests.Scenarios;
using Microsoft.Test.UIAutomation.Logging;
public sealed class TestMain
{
// Time in milliseconds to wait for the application to start.
static int MAXTIME = 5000;
// Time in milliseconds to wait before trying to find the application.
static int TIMEWAIT = 100;
/// -------------------------------------------------------------------
/// <summary>
/// Start Notepad, obtain an AutomationElement object, and run tests.
/// </summary>
/// -------------------------------------------------------------------
[STAThread]
static void Main(string[] args)
{
// Dump the information to the console window.
// Use a different LogTypes value if you need to dump to another logger,
// or create your own logger that complies with the interface.
UIAVerifyLogger.SetLoggerType(LogTypes.ConsoleLogger);
// Get the automation element.
AutomationElement element = StartApplication("NOTEPAD.EXE", null);
// Call the UI Automation Test Library tests.
TestRuns.RunAllTests(element, true, TestPriorities.Pri0,
TestCaseType.Generic, false, true, null);
// Clean up.
((WindowPattern)element.GetCurrentPattern(WindowPattern.Pattern)).Close();
// Dump the summary of results.
UIAVerifyLogger.ReportResults();
}
/// -------------------------------------------------------------------------
/// <summary>
/// Start the application and retrieve its AutomationElement.
/// </summary>
/// -------------------------------------------------------------------------
static public AutomationElement StartApplication(string appPath,
string arguments)
{
Process process;
Library.ValidateArgumentNonNull(appPath, "appPath");
ProcessStartInfo psi = new ProcessStartInfo();
process = new Process();
psi.FileName = appPath;
if (arguments != null)
{
psi.Arguments = arguments;
}
UIAVerifyLogger.LogComment("Starting({0})", appPath);
process.StartInfo = psi;
process.Start();
int runningTime = 0;
while (process.MainWindowHandle.Equals(IntPtr.Zero))
{
if (runningTime > MAXTIME)
throw new Exception("Could not find " + appPath);
Thread.Sleep(TIMEWAIT);
runningTime += TIMEWAIT;
process.Refresh();
}
UIAVerifyLogger.LogComment("{0} started", appPath);
UIAVerifyLogger.LogComment("Obtained an AutomationElement for {0}", appPath);
return AutomationElement.FromHandle(process.MainWindowHandle);
}
}
}