我正在尝试编写一些用于测试 GUI 界面的测试。我决定选择 NUnit.Forms。但是测试失败并出现以下错误:
TearDown : System.ComponentModel.Win32Exception : The requested resource is in use
我有两个版本的源代码测试。
首先:
using System.Windows.Forms;
using NUnit.Extensions.Forms;
using NUnit.Framework;
using YAMP;
namespace Tests.GUITests
{
[TestFixture]
public class GuiTest : NUnitFormTest
{
private FrmMain _frm;
//[SetUp] // or it is still needed
public override void Setup()
{
base.Setup();
_frm = new FrmMain();
_frm.Show();
}
[Test]
public void TestData()
{
var txtInput = new TextBoxTester("txtInput") {["Text"] = "2+2"};
var txtOutput = new TextBoxTester("txtOutput");
Assert.AreEqual("2+2", txtInput.Text);
var btnRes = new ButtonTester("btnRes");
btnRes.Click();
Assert.AreEqual("4", txtOutput.Text);
}
}
}
第二个:
using System.Windows.Forms;
using NUnit.Extensions.Forms;
using NUnit.Framework;
using YAMP;
namespace Tests.GUITests
{
[TestFixture]
public class GuiTest : NUnitFormTest
{
private FrmMain _frm;
//[SetUp] // or it is still needed
public override void Setup()
{
base.Setup();
_frm = new FrmMain();
_frm.Show();
}
[TearDown]
public override void TearDown()
{
_frm.Close();
_frm.Dispose();
}
[Test]
public void TestData()
{
var txtInput = new TextBoxTester("txtInput") {["Text"] = "2+2"};
var txtOutput = new TextBoxTester("txtOutput");
Assert.AreEqual("2+2", txtInput.Text);
var btnRes = new ButtonTester("btnRes");
btnRes.Click();
Assert.AreEqual("4", txtOutput.Text);
}
}
}
并且有两个不同版本的方法 TestNoData:
public void TestFormNoDataHandler()
{
var messageBoxTester = new MessageBoxTester("Message");
messageBoxTester.ClickOk();
}
[Test]
public void TestNoData()
{
ExpectModal("Message", TestFormNoDataHandler);
var txtInput = new TextBoxTester("txtInput") {["Text"] = string.Empty};
Assert.AreEqual(string.Empty, txtInput.Text);
var btnRes = new ButtonTester("btnRes");
btnRes.Click();
Assert.IsFalse(_frm.DialogResult == DialogResult.OK);
}
[Test]
public void TestNoData()
{
var txtInput = new TextBoxTester("txtInput") {["Text"] = string.Empty };
Assert.AreEqual(string.Empty, txtInput.Text);
var btnRes = new ButtonTester("btnRes");
btnRes.Click();
Assert.IsFalse(_frm.Enable);
}
可测试的形式非常简单。有两个文本框——“txtInput”、“txtOutput”和按钮——“btnRes”。在“txtInput”中引入了一个数学表达式,并在“txtOutput”中输出响应。当您按下“btnRes”时,表达式的决定就会发生。如果“txtInput”字段为空,则该按钮被禁用,您无法点击它。
在搜索此问题的解决方案时,出现了以下链接:
- AutomaticChainsaw: WinForms testing using NUnitForms
- c# - I need to create a windows form from within a NUnit test - Stack Overflow
不幸的是,我只能附上 2 个链接。但是我了解到的信息却大相径庭。尤其是写方法Setup和TearDown的部分。
无论如何,我指定我使用的版本:
- Visual Studio 2015 社区
- NUnit - 2.6.4.14350
- NUnitForms - 1.3.1771.29165
因为在我看来问题可能出在框架的最新版本上,因为我学到的文章很旧。
感谢您的任何建议。
最佳答案
UseHidden 属性:测试在单独的隐藏桌面上运行。这使它们更快,并且适用于任何不使用键盘或鼠标 Controller 的测试。它们的破坏性较小,输入测试不会干扰其他应用程序。
UseHidden 属性控制是否完全使用单独的桌面。
虽然在单独的桌面上进行测试更快更安全(没有键盘或鼠标输入会影响正在运行的应用程序的危险。),但是对于某些操作系统或环境,单独的桌面不起作用。测试会抛出如下错误:
System.ComponentModel.Win32Exception : The requested resource is in use
--TearDown
at NUnit.Extensions.Forms.Desktop.Destroy()
at NUnit.Extensions.Forms.Desktop.Dispose()
at NUnit.Extensions.Forms.NUnitFormTest.Verify()
在这种情况下,您可以覆盖测试类中的 UseHidden 属性并将其设置为返回 false。这将使测试在原始的标准桌面上运行。
关于c# - 使用 NUnit.Forms 进行 GUI 界面测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33566278/