在多个编码的ui测试之间共享测试对象下的应用程序
本文关键字:测试 共享 对象 应用程序 之间 ui 编码 | 更新日期: 2023-09-27 18:04:25
我想在单个测试中启动正在测试的应用程序,并在其他测试中使用打开的应用程序。这是因为启动应用程序需要相当长的时间,如果我为每个测试重复它可能会很昂贵。我希望在对象映射中有一个由AUT组成的单个对象,该对象与UI映射对象一起初始化。
此方法失败,因为对象没有在不同的测试之间传递,即使它是静态的。这个问题有什么解决办法吗?
UIMap
public partial class UIMap
{
public ApplicationUnderTest _aut { get; set; }
public void AUT_Open()
{
string AUTExecutable = ConfigurationManager.AppSettings["AUTExecutable"];
_aut = ApplicationUnderTest.Launch(AUTExecutable );
}
...
}
private static UIMap map;
[TestMethod]
public void Test01()
{
...
this.UIMap.RecognitionDesigner_Open();
}
[TestMethod]
public void Test02()
{
//Do something on the UIMap that tries to use the same member variable- _aut
//in the UIMap
}
我可以通过使用_aut.CloseOnPlaybackCleanup = false;
来解决这个问题。显然,对UIMap对象的引用似乎在每个测试方法结束时丢失。
public partial class UIMap
{
public ApplicationUnderTest _aut { get; set; }
public void AUT_Open()
{
string AUTExecutable = ConfigurationManager.AppSettings["AUTExecutable"];
_aut = ApplicationUnderTest.Launch(AUTExecutable );
_aut.CloseOnPlaybackCleanup = false;
}
...
}
测试彼此独立运行,并且在每个测试上重新创建UIMap。我建议使用ClassInitialize
属性,因为标记此属性的方法只执行一次,并且在类中的所有测试之前执行。您将绝对确定您的进程将被启动,因为现在您依赖于执行测试的顺序,这不是很好。
private static TestContext contextSave;
[ClassInitialize]
public static void DoOneTime(TestContext context)
{
string AUTExecutable = ConfigurationManager.AppSettings["AUTExecutable"];
_aut = ApplicationUnderTest.Launch(AUTExecutable );
context.Properties.Add("AUT", _aut);
contextSave = context;
}
[TestMethod]
public void Test01()
{
//...
DoSthmWithAUT(context.Properties["AUT"]);
}
[TestMethod]
public void Test02()
{
DoOtherWithAUT(context.Properties["AUT"]);
}
[ClassCleanup]
public static void Cleanup()
{
contextSave = null;
}
注意,通常情况下,您无法判断Test01是否先于Test02运行。如果真的想要顺序-那么使用Ordered Tests
我有同样的问题,即在第一个测试方法中初始化的AUT对象在第二个方法中为NULL。我尝试了很多方法,但只有一种对我有帮助:我必须使类的AUT属性为static!
这是我使用计算器应用程序的非常简单的代码。
using System;
using Microsoft.VisualStudio.TestTools.UITesting;
using Microsoft.VisualStudio.TestTools.UITesting.WpfControls;
using Microsoft.VisualStudio.TestTools.UITesting.WinControls;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.VisualStudio.TestTools.UITest.Extension;
using Keyboard = Microsoft.VisualStudio.TestTools.UITesting.Keyboard;
namespace CUIT
{
[CodedUITest]
public class UITestDemo
{
private readonly string path = @"C:'Windows'SysWOW64'calc.exe";
static ApplicationUnderTest app = null;
[TestMethod]
public void Start()
{
app = ApplicationUnderTest.Launch(path);
Playback.Wait(1000);
app.CloseOnPlaybackCleanup = false;
app.SearchProperties[ApplicationUnderTest.PropertyNames.Name] = "Calculator";
app.SearchProperties[ApplicationUnderTest.PropertyNames.ClassName] = "CalcFrame";
}
[TestMethod]
public void TestButtonOne()
{
Assert.IsNotNull(app, "Should not be NULL!");
app.SetFocus();
WinButton btn1 = new WinButton(app);
btn1.SearchProperties[WinButton.PropertyNames.Name] = "1";
Mouse.Click(btn1);
Mouse.Click(btn1);
Mouse.Click(btn1);
Playback.Wait(3000);
}
}
}