如何从命令行运行 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 并在浏览器中打开页面:
<script type="text/javascript" src="../index.js"></script>
<script src="tests.js"></script>
从命令行运行
使用下面描述的设置,您可以尝试运行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 测试?的主要内容,如果未能解决你的问题,请参考以下文章
如何从命令行使用 maven 运行 selenium 测试?