2018-01-08 20:45:03 +01:00
|
|
|
|
---
|
2018-07-28 09:14:57 +02:00
|
|
|
|
id: unit-testing(单元-测试)
|
|
|
|
|
title: "单元测试"
|
2018-01-08 20:45:03 +01:00
|
|
|
|
---
|
2018-07-28 09:14:57 +02:00
|
|
|
|
所有测试都被分成3 个文件夹:
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
- `test/unit` - 涵盖非平凡方式转换数据的功能测试。这些测试只 `require()` 一些文件并在其中运行代码,因此它们是非常快的。
|
|
|
|
|
- `test/functional` - 启动verdaccio instance并在 http上执行一系列请求的测试。它们比单元测试慢一些。
|
|
|
|
|
- `test/integration` - 启动verdaccio instance并用 npm对其执行请求的测试。它们真的很慢并能打击到真的npm registry。 **unmaintained test**
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
单元和功能测试是从项目根目录里运行 `npm test` 来自动执行的。集成测试应该时常手动执行。
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
我们所有测试都使用 `jest`。
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
## Npm 脚本
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
要运行测试脚本,您可以使用 `npm` 或 `yarn`。
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
|
|
|
|
yarn run test
|
|
|
|
|
|
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
这将只会触发测试,单元和功能的前两组。
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
### 使用测试/单元
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
以下只是单元测试的一个例子。基本上遵守`jest` 标准。
|
2018-01-21 00:04:36 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
请试着描述单元在 `test` 部分页眉里的单一句子里确切测试什么。
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
|
|
|
|
```javacript
|
2018-01-21 00:04:36 +01:00
|
|
|
|
const verdaccio = require('../../src/api/index');
|
|
|
|
|
const config = require('./partials/config');
|
|
|
|
|
|
|
|
|
|
describe('basic system test', () => {
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-01-21 00:04:36 +01:00
|
|
|
|
beforeAll(function(done) {
|
|
|
|
|
// something important
|
|
|
|
|
});
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-01-21 00:04:36 +01:00
|
|
|
|
afterAll((done) => {
|
|
|
|
|
// undo something important
|
|
|
|
|
});
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-01-21 00:04:36 +01:00
|
|
|
|
test('server should respond on /', done => {
|
|
|
|
|
// your test
|
|
|
|
|
done();
|
|
|
|
|
});
|
|
|
|
|
});
|
2018-01-08 20:45:03 +01:00
|
|
|
|
```
|
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
### 使用测试/功能
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
Verdaccio 中的功能测试有点复杂,需要深入解释来让您有成功的体验。
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
一切从`index.js`文件开始。让我们来深入了解它吧。
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
|
|
|
|
```javascript
|
2018-01-21 00:04:36 +01:00
|
|
|
|
// we create 3 server instances
|
|
|
|
|
const config1 = new VerdaccioConfig(
|
|
|
|
|
'./store/test-storage',
|
|
|
|
|
'./store/config-1.yaml',
|
|
|
|
|
'http://localhost:55551/');
|
|
|
|
|
const config2 = new VerdaccioConfig(
|
|
|
|
|
'./store/test-storage2',
|
|
|
|
|
'./store/config-2.yaml',
|
|
|
|
|
'http://localhost:55552/');
|
|
|
|
|
const config3 = new VerdaccioConfig(
|
|
|
|
|
'./store/test-storage3',
|
|
|
|
|
'./store/config-3.yaml',
|
|
|
|
|
'http://localhost:55553/');
|
|
|
|
|
const server1: IServerBridge = new Server(config1.domainPath);
|
|
|
|
|
const server2: IServerBridge = new Server(config2.domainPath);
|
|
|
|
|
const server3: IServerBridge = new Server(config3.domainPath);
|
|
|
|
|
const process1: IServerProcess = new VerdaccioProcess(config1, server1, SILENCE_LOG);
|
|
|
|
|
const process2: IServerProcess = new VerdaccioProcess(config2, server2, SILENCE_LOG);
|
|
|
|
|
const process3: IServerProcess = new VerdaccioProcess(config3, server3, SILENCE_LOG);
|
|
|
|
|
const express: any = new ExpressServer();
|
|
|
|
|
...
|
|
|
|
|
|
|
|
|
|
// we check whether all instances has been started, since run in independent processes
|
|
|
|
|
beforeAll((done) => {
|
|
|
|
|
Promise.all([
|
|
|
|
|
process1.init(),
|
|
|
|
|
process2.init(),
|
|
|
|
|
process3.init()]).then((forks) => {
|
|
|
|
|
_.map(forks, (fork) => {
|
|
|
|
|
processRunning.push(fork[0]);
|
|
|
|
|
});
|
|
|
|
|
express.start(EXPRESS_PORT).then((app) =>{
|
|
|
|
|
done();
|
|
|
|
|
}, (err) => {
|
|
|
|
|
done(err);
|
|
|
|
|
});
|
|
|
|
|
}).catch((error) => {
|
|
|
|
|
done(error);
|
|
|
|
|
});
|
2018-01-08 20:45:03 +01:00
|
|
|
|
});
|
|
|
|
|
|
2018-01-21 00:04:36 +01:00
|
|
|
|
// after finish all, we ensure are been stoped
|
|
|
|
|
afterAll(() => {
|
|
|
|
|
_.map(processRunning, (fork) => {
|
|
|
|
|
fork.stop();
|
|
|
|
|
});
|
|
|
|
|
express.server.close();
|
2018-01-08 20:45:03 +01:00
|
|
|
|
});
|
|
|
|
|
|
2018-01-21 00:04:36 +01:00
|
|
|
|
|
2018-01-08 20:45:03 +01:00
|
|
|
|
```
|
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
### 使用
|
2018-01-21 00:04:36 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
这里我们将描述常规功能测试看起来是什么样的,请核对内联了解更多详细信息。
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
|
|
|
|
#### The lib/server.js
|
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
服务器 class(类)只是模拟 `npm` client 的 wrapper类,它为功能测试提供简单的API。
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
如我们在之前的章节里提到的, 我们正创建3 个流程服务器,可以在每个流程里以`server1`, `server2` 和 ``server3`进行访问。
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
通过这样的引用,您可以给这任何3 个运行的instance 发送请求。
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
|
|
|
|
```javascript
|
2018-01-21 00:04:36 +01:00
|
|
|
|
<br />export default function(server) {
|
|
|
|
|
// we recieve any server instance via arguments
|
|
|
|
|
test('add tag - 404', () => {
|
|
|
|
|
// we interact with the server instance.
|
|
|
|
|
return server.addTag('testpkg-tag', 'tagtagtag', '0.0.1').status(404).body_error(/no such package/);
|
2018-01-08 20:45:03 +01:00
|
|
|
|
});
|
2018-01-21 00:04:36 +01:00
|
|
|
|
});
|
2018-01-08 20:45:03 +01:00
|
|
|
|
```
|
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
### 测试/集成
|
2018-01-08 20:45:03 +01:00
|
|
|
|
|
2018-07-28 09:14:57 +02:00
|
|
|
|
这些部分还没有被使用,但是我们在寻求帮助来让它正常运转。**欢迎任何新的想法。**
|