如何从命令行运行 QUnit 测试?

Posted

技术标签:

【中文标题】如何从命令行运行 QUnit 测试?【英文标题】:How to run QUnit tests from command line? 【发布时间】:2014-09-02 10:50:27 【问题描述】:

我最近开始开发一个 Rails 应用程序,该应用程序已经有大量 QUnit 测试用于测试 ember。我负责使用 CI 设置应用程序的任务(我决定使用 CodeShip)。我目前面临的问题是我运行 qunit 测试的唯一方法是转到http://localhost:3000/qunit。我需要设置一种从命令行运行测试的方法。我已经进行了大量研究,并尝试了至少 10 种不同的解决方案,但没有一个成功。

目前我正在尝试使用teaspoon,但我没有设法让它工作。任何帮助将非常感激。如果我需要发布有关设置的更多信息,请告诉我。

【问题讨论】:

【参考方案1】:

TL;DR

使用开箱即用的qunit 命令(预先执行npm install -g qunit),因此您不需要额外的依赖项。


扩展一点 Arthur 的答案,因为他只提到了仅适用于最简单项目的最简单案例。

正如QUnit 页面上所提到的,内置了从命令行运行测试的可能性。 无需在 QUnit 之上安装额外的奇怪框架!

npm install -g qunit
qunit # Will search for tests in "test" directory

这适用于他们网站上的人工测试,但在实际项目中,您可能会将您的逻辑放在其他一些 .js 文件中。

结构如下:

project
│   index.js <--- Your script with logic
│   package.json <--- most probably you'll have npm file since qunit executable is installed via npm
└───test
        tests.html <--- QUnit tests included in standard HTML page for "running" locally
        tests.js <--- QUnit test code

让我们想象一下,在您的 index.js 中,您有以下内容:

function doSomething(arg) 
  // do smth
  return arg;

还有tests.js中的测试代码(不是说它可以是文件的整个内容——你不需要其他任何东西来工作):

QUnit.test( "test something", function( assert ) 
  assert.ok(doSomething(true));
);

在浏览器中运行

这与问题没有直接关系,只是想在这里做一个参考。 只需将您的脚本和测试都放入 tests.html 并在浏览器中打开页面:

&lt;script type="text/javascript" src="../index.js"&gt;&lt;/script&gt;

&lt;script src="tests.js"&gt;&lt;/script&gt;

从命令行运行

使用下面描述的设置,您可以尝试运行qunit,但它不会工作,因为它找不到您的函数doSomething。要使其可访问,您需要在脚本中添加两件事。

首先是从测试中明确“导入”您的脚本。由于 JS 没有开箱即用的功能,我们需要使用来自 NPM 的require。为了让我们的测试在 HTML 中运行(当您从浏览器运行它时,require 未定义)添加简单检查:

// Add this in the beginning of tests.js
// Use "require" only if run from command line
if (typeof(require) !== 'undefined') 
    // It's important to define it with the very same name in order to have both browser and CLI runs working with the same test code
    doSomething = require('../index.js').doSomething;

但如果index.js 不公开任何内容,则将无法访问任何内容。因此,需要显式公开您想要测试的函数(阅读更多关于exports 的信息)。将此添加到 index.js:

//This goes to the very bottom of index.js
if (typeof module !== 'undefined' && module.exports) 
  exports.doSomething = doSomething; 

完成后,首先检查 tests.html 是否仍在工作并且没有引发任何错误(测试测试基础设施,是的),最后尝试

qunit

输出应该是这样的

TAP version 13
ok 1 Testing index.js > returnTrue returns true
1..1
# pass 1
# skip 0
# todo 0
# fail 0

我不想为我的简单(或不)项目处理节点

这是一个悬而未决的问题,我无法回答。但是无论如何,您都需要 一些 runner 来运行 QUnit 测试。所以也许拥有package.json 和一个像"qunit": "^2.6.1" 这样的devDependency 并不是最糟糕的选择。有几个3rd-party runner:grunt-qunit,PhantomJS runnner,ember-qunit-cli,也可以在官方QUnit Plugins page查看更多

如果我有课而不是功能怎么办?

在 JS 中一切都是函数,对吧 :)?所以没问题,只需相应地更改您的脚本导出和测试导入

exports.exportedMyClass = MyClass; // in index.js
MyClass= require('../index.js').exportedMyClass ; // in tests.js

参见示例,也称为小型入门 here。

【讨论】:

【参考方案2】:

QUnit now has its own CLI:

$ npm install -g qunit
$ qunit 'tests/*-test.js'
TAP version 13
ok 1 Module > Test #1
ok 2 Module > Test #2
1..2
# pass 2
# skip 0
# todo 0
# fail 0

运行qunit --help 了解更多使用信息。

【讨论】:

这里的问题是我需要导入我的项目脚本。所以在 HTML 中你可以很简单地做到这一点:包含你的脚本,包含测试脚本,在测试脚本中使用你的函数。但是,当您通过此命令行运行时,会出现错误“未定义的函数 myProjectFunction” - 因为它不知道从哪里获取您的项目脚本。 @TheGodfather 是的,这是真的,我一直在为自己苦苦挣扎。我认为当您已经使用 Node 的 require() 函数导入模块时,这种运行 QUnit 的方法最容易完成,如果您想测试非 Node 项目,这会有点问题。【参考方案3】:

node-qunit-phantomjs 可以轻松完成工作,并且是独立的,而不是 Grunt-、Gulp-、任何插件:

$ npm install -g node-qunit-phantomjs

$ node-qunit-phantomjs tests.html
Testing tests.html
Took 8 ms to run 1 tests. 0 passed, 1 failed.
...
$ echo $?
1

【讨论】:

当我尝试运行测试时出现错误“在严格模式之外尚不支持块范围的声明(let、const、函数、类)”你有什么想法吗? PhantomJS 基于旧版本的 webkit,不再维护。例如,在 Selenium 中使用时会引发弃用警告/错误。【参考方案4】:

您可以为此使用Grunt(任务运行器)。您还需要安装这两个包:grunt-contrib-qunit 和 grunt-contrib-connect

我最近在尝试弄清楚如何在 Travis CI 上运行 QUnit 时建立了一个 GitHub 存储库:https://github.com/stebru/travis-qunit-test

欢迎你 fork 自己尝试一下。

【讨论】:

如果您在设置 grunt 方面需要任何帮助,请告诉我。

以上是关于如何从命令行运行 QUnit 测试?的主要内容,如果未能解决你的问题,请参考以下文章

从命令行运行 gradle 时如何执行和显示友好的测试输出

如何从命令行使用 maven 运行 selenium 测试?

如何在针对特定 Gradle 构建风格的同时从命令行运行单个单元测试方法

如何从命令行而不是 XCode 运行 DOCTest

如何从命令行在 iPhone 上启动 OCUnit 测试

如何从命令行设置 android 仪器测试的 vm heapsize