QUnit 模型、测试和断言命名约定

Posted

技术标签:

【中文标题】QUnit 模型、测试和断言命名约定【英文标题】:QUnit Model, Test, and Assert Naming Conventions 【发布时间】:2013-07-24 15:01:15 【问题描述】:

我正在为我的 javascript Web 应用程序编写 QUnit 测试。在阅读了QUnit API documentation 之后,我找不到任何标记模块、测试和断言的标准。

API 描述和示例非常简陋:

模块名称:这组测试的标签。示例:module("group a");

测试标题:被测试单元的标题。示例:test("hello test", function());

断言消息:断言的简短描述。示例:ok(true, "true succeeds");

我发现了很多关于单元测试的文章:What are some popular naming conventions for Unit Tests? 和 Unit test naming best practices。

但是,我希望有一个特定于 QUnit 的 Module->Test->Assert 模式的既定/普遍接受的标准。有吗?

【问题讨论】:

【参考方案1】:

无论您使用什么测试框架,无论您是在编写客户端还是服务器端单元测试,采用一些“命名约定”的主要关注点是确保测试名称清楚地向每个人说明什么是系统和被测行为。

假设我们要测试这段代码:

var MyClass = (function () 
    function MyClass() 
        this.defaultMessage = "Hello person without a name";
    
    MyClass.prototype.getHelloMessage = function (firstName, lastName) 
        if (!firstName && !lastName) 
            return this.defaultMessage;
        
        var message = "Hello";
        if (lastName) 
            message += " " + lastName;
        
        if (firstName) 
            if (lastName) 
                message += ",";
            
            message += " " + firstName;
            
        return message;
    ;        
    return MyClass;
)();

上面的代码只是用给定的输入参数(如果有的话)格式化一个简单的消息,如果没有指定参数,则返回一个默认的消息。

对我来说,模块名称是类名和分隔符,以使测试名称列表更具可读性:

QUnit.module("MyClass tests - ");

可以简单地命名测试:

test("getHelloMessage test", function () 

并在一个文本中断言所有期望。

我更喜欢更详细的方法,这样可以清楚地理解每个测试的目的:

test("getHelloMessage without input parameters should return default message", function () );
test("getHelloMessage with only lastName should not display a comma", function () );
test("getHelloMessage with only firstName should not display a comma", function () );

这样每个测试都有一个明确的目的,它们将保持尽可能小,当一个测试失败时,很容易理解你的代码的哪一部分受到了最新更改的影响。

良好的标准是团队所有成员都同意的标准,它可以帮助每个人发现和解决错误,并帮助他们编写更好的单元测试。

【讨论】:

非常感谢 @Justin 的代码格式化。我没有看到那些阻止格式化的隐藏字符,但你在那里找到了它们! :-)

以上是关于QUnit 模型、测试和断言命名约定的主要内容,如果未能解决你的问题,请参考以下文章

使用 mvvmcross,我如何“共享”一个视图模型以使用 iphone 的视图和 ipad 的另一个视图?有啥特殊的命名约定吗?

单元测试都有哪些流行的命名约定? [关闭]

单元测试都有哪些流行的命名约定? [关闭]

在 Python 中测试文件名是不是具有正确的命名约定

markdown 单元测试命名约定

html/css + MVC 的命名约定?