是否存在与pytest的参数化装置等效的Javascript?

时间:2017-12-07 10:04:10

标签: javascript unit-testing mocha pytest

在pytest中,你可以设置可以有多个不同值的灯具。这些被称为"参数化灯具"。使用这些灯具的测试将使用这些灯具的所有可能值组合运行。

示例

# Fixture `a` can have the values `1` and `2`
@pytest.fixture(params=[1, 2])
def a(request):
    yield request.param

# Fixture `b` can have the values `3` and `4`
@pytest.fixture(params=[3, 4])
def b(request):
    yield request.param

# The test `test_sum` uses the fixtures `a` and `b`
def test_sum(a, b):
    assert sum([a, b]) == a + b

这里,函数test_sum总共运行四次。每次运行将分别使用不同的参数:a=1, b=3a=1, b=4a=2, b=3a=2, b=4

问题

在任何Javascript测试库中是否存在等效的参数化装置? (我们目前使用的是mocha,这对我们来说是最有趣的)

3 个答案:

答案 0 :(得分:1)

不幸的是,没有。直到今天,根据我在Internet上找到的内容,Mocha都不支持它。这种语法也有https://github.com/dotnet/coreclr/issues/552,但是目前唯一的解决方案是他们称之为rejected proposal(s)的东西,并且语法看起来像下面的代码(取自文档)。您也可以阅读有关dynamically generating tests的更多信息。

describe('Possible user names behaves correctly ', () => {
  const TEST_CASES = [
    {args: ['rj'], expected: false},
    {args: ['rj12345'], expected: false},
    {args: ['rj123'], expected: true},
  ]

  TEST_CASES.forEach((testCase) => {
    it(`check user name ${JSON.stringify(testCase.args)}`, () => {
      const result = checkUserName.apply(this, testCase.args)

      expect(testCase.expected).toEqual(result)
    })
  })
})

答案 1 :(得分:0)

遇到python和js都需要参数化测试的时候,我觉得一个既好用又好读的就是Jest中包含的.each语法(抱歉,还没有找到Mocha的选项! ).

一个很好的例子可以在这里找到:https://dev.to/flyingdot/data-driven-unit-tests-with-jest-26bh

答案 2 :(得分:0)

Playwright Test 测试框架借鉴了 PyTest 的这个概念;详情请参阅 https://playwright.dev/docs/test-fixtures