自动化Javascript测试与Mocha.js

自动化Javascript测试与Mocha.js

众所周知,代码容易出错,有时即使我们知道某个特定的工作流对某些案例能正常运行,但也很有可能忘记了其他一些案例。

简单来说,可以说当我们手动测试代码时,可能会漏掉一些东西。例如,假设我们有两个函数, func1()func2() ,我们知道 func1() 适用于我们在测试中定义的案例,但我们发现 func2() 不起作用。然后我们修复了 func2() ,但后来忘记检查我们在 func2() 中做的更改后,在整个流程中 func1() 是否起作用。这个过程可能导致错误,这是一种典型的情况,发生几次。

现在,我们知道以手动方式运行测试并不是一个非常理想的选择,因此建议我们在编写的代码之外运行编写的测试。这就是所谓的 自动化测试。

在本教程中,我们将探索如何使用Mocha在JavaScript中进行自动化测试。

第一步是在我们的代码中能够使用Mocha。为此,我们可以利用mocha.js提供的CDN链接。在本教程中,我们还将使用 Chai.jsExpect.js ,当我们想要检查我们可能编写的不同函数的确切行为时,它们与Mocha很好地配合使用。

以下是你需要在你的 index.html 文件中导入的所有CDN链接。

Expect.js

https://cdn.rawgit.com/Automattic/expect.js/0.3.1/index.js

Chai.js

https://cdn.rawgit.com/chaijs/chai/3.5.0/chai.js

Mocha.js

https://cdn.rawgit.com/mochajs/mocha/2.2.5/mocha.js

下一步是在您喜欢的IDE或代码编辑器内的一个简单项目目录中创建三个文件。

  • index.html
  • index.js
  • tests.js

您还可以使用下面显示的 命令

touch index.html index.js tests.js

注意 - 可能您的本地机器上 touch 命令无法工作,在这种情况下,请使用 vi 命令。

index.html

现在我们创建了所有文件,是时候编写代码了。打开 index.html 文件并粘贴以下行。

示例

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
   <title>Automated Testing With Mocha</title>
   <link href="https://cdn.rawgit.com/mochajs/mocha/2.2.5/mocha.css" rel="stylesheet" />
</head>
<body>
   <div id="mocha"></div>
   <script src="https://cdn.rawgit.com/Automattic/expect.js/0.3.1/index.js"></script>
   <script src="https://cdn.rawgit.com/chaijs/chai/3.5.0/chai.js"></script>
   <script src="https://cdn.rawgit.com/mochajs/mocha/2.2.5/mocha.js"></script>
   <script src="index.js"></script>
   <script>
      const mocha = window.mocha;
      mocha.setup('bdd');
   </script>
   <script src="tests.js"></script>
   <script>
      mocha.checkLeaks();
      mocha.run();
   </script>
</body>
</html>

解释

在上述HTML代码中,我通过CDN导入了所有的依赖项,如 Mocha,ChaiExpect

然后,我以同步顺序导入了两个不同的js文件,分别是 index.jstests.js ,这意味着首先执行 index.js 文件,然后执行一个脚本,其中设置了 window.mocha()bdd。

请考虑下面显示的代码片段。

const mocha = window.mocha;
mocha.setup('bdd');

在上面的代码之后,我正在调用名为 tests.js 的文件,并且随后调用Mocha的不同方法。考虑下面的代码片段。

mocha.checkLeaks();
mocha.run();

现在是时候以自动化的方式编写一些函数或函数来使用Mocha进行测试了。考虑下面所示的 index.js代码

function addNumbers(a, b) {
   return a + b;
}

上述函数是一个非常简单的函数,它有两个参数,然后在响应中简单地返回这两个数字的和。

tests.js

现在让我们来看看有趣的部分,我们将通过自动化测试来测试上述函数是否按预期工作。考虑下面显示的tests.js的代码。

const chai = window.chai
const expect = chai.expect
describe('addNumbers', () => {
   it('should be able to add two numbers and give proper result', () => {
      expect(addNumbers(1, 3)).to.deep.equal(4)
      expect(addNumbers(1, 5)).to.deep.equal(6)
      expect(addNumbers(-9, -10)).to.deep.equal(-19)
   })
})

在以上的代码中,我正在导入 ChaiExpect 包,这些包通过 index.html 文件中的CDN链接提供给我们使用。

此外,我们正在使用 describe 函数,其中传递的第一个参数是我们选择的字符串。接下来,我们在该函数内部创建了一个匿名函数,在该函数内部我们调用了 it() 函数,该函数的第一个参数是一个字符串,第二个参数是一个匿名箭头函数。

我们正在使用 expect 函数,其中我们将要测试的实际函数作为参数调用,然后使用 deep.equal() 方法进行相等性检查。

输出

运行HTML代码并在浏览器中打开代码后,一切都应该按预期工作。您应该在浏览器中看到一段文本,与下面所示的类似。

>addNumbers
should be able to add two numbers and give proper result

让我们再添加一个函数

在上面的示例中,我们测试了一个名为 addNumbers 的简单JavaScript函数。现在,让我们尝试添加另一个函数,但这次我们将使用箭头函数。考虑下面显示的代码。

index.js

let multiplyNumber = (a, b) => {
   return a * b;
}

tests.js

现在,让我们在 tests.js 文件中为上述函数编写一个自动化测试。考虑下面显示的代码片段。

describe('multiplyNumber', () => {
   it('should be able to multiply two numbers and give proper result',() => {
       expect(multiplyNumber(1, 3)).to.deep.equal(3)
      expect(multiplyNumber(1, 5)).to.deep.equal(5)
      expect(multiplyNumber(-9, -10)).to.deep.equal(90)
   })
})

输出

运行HTML代码,这次你将在浏览器中得到这两个函数的名称。

addNumbers
should be able to add two numbers and give proper result‣
multiplyNumber
should be able to multiply two numbers and give proper result

如果函数不返回预期输出怎么办?

在我们为两个函数编写自动化测试时,实际上我们期望正确的值。如果在函数的核心逻辑中进行更改使其返回错误的值会怎样呢?

考虑一个名为 multiplyNumber 的函数,它位于 index.js 文件中。让我们对该函数进行更改,使其不给出我们期望的输出。

multiplyNumber

let multiplyNumber = (a, b) => {
   return a * b;
}

输出

现在,如果我们在浏览器中运行HTML代码,我们将在浏览器中得到以下输出结果。

multiplyNumber
should be able to multiply two numbers and give proper result‣
AssertionError: expected 0.3333333333333333 to deeply equal 3

使用多个描述函数进行自动化测试

在以上两个示例中,我们使用了一个单独的describe函数和简单函数。现在假设我们想要使用一个函数来计算一个数字的幂。

考虑下面展示的index.js代码:

function power(x, n) {
   let res = 1;
   for (let i = 0; i < n; i++) {
      res *= x;
   }
   return res;
}

在上面的函数中,我们接受两个参数,然后将一个数字的幂次方提高到n倍。

tests.js

现在让我们为这个函数编写一个自动化测试。

describe("power", function () {
   describe("raises x to power 2", function () {
      function checkPower(x) {
         let expected = x * x;
         it(`{x} in the power 2 is{expected}`, function () {
            expect(power(x, 2)).to.deep.equal(expected);
         });
      }
      for (let x = 1; x <= 5; x++) {
         checkPower(x);
      }
   });
});

我们可以看到,在自动化测试函数中,我们使用了嵌套的 describe 函数。在这里,我们正在检查我们在 index.js 中编写的 power() 函数是否按预期工作。

输出

power
raises x to power 2
1 in the power 2 is 1‣
2 in the power 2 is 4‣
3 in the power 2 is 9‣
4 in the power 2 is 16‣
5 in the power 2 is 25

结论

在本教程中,我们通过示例解释了如何使用Mocha.js、Chai.js和Expect.js在JavaScript中执行自动化测试。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程