Frisby功能测试标准

时间:2015-10-27 13:01:38

标签: node.js functional-testing frisby.js

我是新手,我一直在寻找方法(或标准)来编写适当的功能测试,但我仍然有许多未解答的问题。我正在使用FrisbyJS为我的NodeJS API应用程序编写功能测试,并使用jasmine-node来运行它们。

我已经阅读了弗里斯比的文档,但这对我来说并不富有成效。

以下是一个场景:

  • 来宾可以创建User。 (显然不允许用户名重复)
  • 创建User后,他可以登录。登录成功后,他获得了一个Access-Token。
  • User可以创建Post。然后,Post可以Comment,依此类推......
  • 创建后无法删除User。 (不是来自我的NodeJS应用程序)

Frisby文档说的是,我应该在测试中编写测试。

例如(full-test.spec.js):

// Create User Test
frisby.create('Create a `User`')
    .post('http://localhost/users', { ... }, {json: true})
    .expectStatus(200)
    .afterJSON(function (json) {

        // User Login Test
        frisby.create('Login `User`')
            .post('http://localhost/users/login', { ... }, {json: true})
            .expectStatus(200)
            .afterJSON(function (json) {

                // Another Test (For example, Create a post, and then comment)

            })
            .toss();

    })
    .toss();

这是编写功能测试的正确方法吗?我不这么认为......看起来很脏。

我希望我的测试是模块化的。每个测试的单独文件。 如果我为每个测试创建单独的文件,那么在为Create Post编写测试时,我需要一个User的访问令牌。

总而言之,问题是:如果事情相互依赖,我应该如何编写测试? Comment取决于PostPost取决于User

2 个答案:

答案 0 :(得分:0)

这是使用NodeJS的副产品。这是我后悔决定弗里斯比的一个重要原因。那个以及我无法找到一个很好的方法来及时地从数据库中加载预期结果以便在测试中使用它们。

答案 1 :(得分:0)

据我了解 - 您基本上希望按顺序执行测试用例。一个接一个。

但由于这是javascript,因此frisby测试用例是异步的。因此,为了使它们同步,文档建议您嵌套测试用例。现在,对于几个测试用例来说,这可能是好的。但如果有数百个测试用例,嵌套就会变得混乱。

因此,我们使用sequenty - 另一个nodejs模块,它使用回调来按顺序执行函数(以及包含在这些函数中的测试用例)。在afterJSON块中,在所有断言之后,你必须做一个回调 - cb()[通过sequenty传递给你的函数]。

https://github.com/AndyShin/sequenty

var sequenty = require('sequenty');

function f1(cb){
    frisby.create('Create a `User`')
    .post('http://localhost/users', { ... }, {json: true})
    .expectStatus(200)
    .afterJSON(function (json) {
         //Do some assertions
         cb(); //call back at the end to signify you are OK to execute next test case
    })
    .toss();
}

function f2(cb){
    // User Login Test
    frisby.create('Login `User`')
        .post('http://localhost/users/login', { ... }, {json: true})
        .expectStatus(200)
        .afterJSON(function (json) {
              // Some assertions
              cb(); 
         })
     .toss();
}

sequenty.run(f1,f2);