如何在C#中通过JavaScript回调运行QUnit测试并获得测试结果?[英] How to run QUnit test and get back test result in C# via JavaScript callback?

问题描述

在我的几个项目中,我使用 MVC 模式将(关注点的)代码分成 3 层.模型层和控制层都在 C# 上运行,因此我使用 MSTest 或 NUnit 等测试框架来验证这些层的功能需求.对于视图层,我使用 QUnit 来测试 JavaScript 文件.

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

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

    Assert.IsTrue(result.Failed <= 0)
}

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

推荐答案

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

  1. 通过 Selenium WebDriver 包 安装到项目中/www.nuget.org/" rel="nofollow noreferrer">NuGet.

在此处输入图片描述

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));

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

QUnit.config.autostart = false;

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

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

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

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

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"]);

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

browser.Close();

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

点击此处下载

更新 1

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

本文地址:https://www.itbaoku.cn/post/1739944.html