如何运行QUnit测试并通过JavaScript回调在C#中获取测试结果?

Sou*_*ter 5 javascript c# selenium qunit phantomjs

在我的几个项目中,我使用MVC模式将代码(关注点)分成3层.Model和Control层都在C#上运行,所以我使用像MSTest或NUnit这样的测试框架来验证这些层的功能需求.对于View层,我使用QUnit来测试JavaScript文件.

但是,我无法将QUnit作为自动化测试执行,因为MSTest不直接支持测试网页.我需要在MSTest中运行它,就像下面的逻辑一样.

[TestMethod]
public void JavaScriptTest()
{
    var result = QUnit.Test('~/QUnit/test1.htm');

    Assert.IsTrue(result.Failed <= 0)
}
Run Code Online (Sandbox Code Playgroud)

解决方案必须在QUnit中使用回调函数(不是在循环检查中)以确保测试完成后立即执行测试方法.

Sou*_*ter 5

对于跨浏览器测试,Selenium WebDriver是解决此问题的最佳选择,因为我们可以通过仅更改一行代码轻松地在浏览器之间切换.

  1. 通过NuGetSelenium WebDriver软件包安装到项目中.

在此输入图像描述

2.将首选驱动程序下载到项目中,添加到项目中并将"复制到输出目录"设置为"如果更新则复制".对于此示例,我使用Chrome驱动程序在我的计算机上使用Google Chrome运行Selenium.

在此输入图像描述

3.在测试方法中,在运行QUnit之前创建驱动程序并设置最大执行时间.

var browser = new ChromeDriver();
var navigator = browser.Navigate();

// Currently, max execution time is one minute.
browser.Manage().Timeouts()
       .SetScriptTimeout(new TimeSpan(0, 1, 0));
Run Code Online (Sandbox Code Playgroud)

4.请确保您已将QUnit的自动启动设置为false.

QUnit.config.autostart = false;
Run Code Online (Sandbox Code Playgroud)

5.导航到QUnit页面.在这种情况下,我在解决方案文件夹中使用本地网页.

 browser.Manage().Timeouts().SetScriptTimeout(new TimeSpan(0, 1, 0));
navigator.GoToUrl(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"../../../QUnit example/qunit-demo.htm"));
Run Code Online (Sandbox Code Playgroud)

6.在浏览器对象中使用ExecuteAsyncScript方法注册QUnit.done函数的回调并手动启动QUnit测试.

var response = browser.ExecuteAsyncScript
(
    "var callback = arguments[arguments.length - 1];" +
    "QUnit.done(callback); QUnit.start();"
);
Run Code Online (Sandbox Code Playgroud)

7.当QUnit测试完成后,它将返回响应.我们需要将其转换为合适的类型并获得测试结果.

var testResult = response as Dictionary<string, object>;

if(testResult == null) throw new Exception("Unhandle error occur while running QUnit."); 

Console.WriteLine("Test complete in " + (long)testResult["runtime"] + " ms.");
Console.WriteLine("---------------------------");
Console.WriteLine("total: " + (long)testResult["total"]);
Console.WriteLine("passed: " + (long)testResult["passed"]);
Console.WriteLine("failed: " + (long)testResult["failed"]);
Run Code Online (Sandbox Code Playgroud)

8.每次使用完成测试时都不要忘记关闭浏览器.

browser.Close();
Run Code Online (Sandbox Code Playgroud)

PS.我还为此答案提供了Visual Studio 2012解决方案(源代码).

点击这里下载

更新1

  • 修复有时QUnit在系统寄存器回调到完成功能之前开始测试的错误.
  • 包括本地QUnit页面.
  • 包括IEDriver下载解决方案.但是,此版本不支持Windows 8上的IE10.但它在IE8上运行良好.