【问题标题】:NestJS- npm test is very slow with a beforeEach hookNestJS- 使用 beforeEach 钩子的 npm 测试非常慢
【发布时间】:2020-11-19 22:26:51
【问题描述】:

我是 NestJS 新手,目前正在学习 NestJS 测试。

beforeEachcreateTestingModule().compile() 和一些 module.get() 会大大增加测试执行,这是一个常见的问题吗?

我有一个虚拟的 expect(true) 测试需要 6 秒才能完成,而有一个 beforeEach 只需要 1 秒(而这个虚拟测试的 1 秒似乎仍然很多)... 当您在监视模式下运行测试时,这非常烦人,因为这需要很多时间,而我仍然只有很少的测试。

我找不到与 NestJS 的这个问题相关的任何内容,所以我可能做错了什么,但我不知道是什么。

我确实尝试使用一些开玩笑的标志,例如 --runInBand--maxWorkers=4,但没有成功。

--

测试的应用程序实际上是通过教程创建的应用程序,这方面没有什么特别需要注意的。

这是我的tasks.service.spec.ts 文件(这是我唯一的测试文件)。如果有帮助,我可以提供一个 Github repo。

import { Test } from '@nestjs/testing';

import { TaskRepository } from './task.repository';
import { TasksService } from './tasks.service';

const mockTaskRepository = () => ({});

describe('tasks.service', () => {
  let tasksService;
  let taskRepository;

  beforeEach(async () => {
    const module = await Test.createTestingModule({
      providers: [
        TasksService,
        { provide: TaskRepository, useFactory: mockTaskRepository },
      ],
    }).compile();

    tasksService = await module.get(TasksService);
    taskRepository = await module.get(TaskRepository);
  });
  describe('Test', () => {
    it('pass', () => {
      expect(true);
    });
  });
});

这是我在package.json中的笑话设置

  "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": "src",
    "testRegex": ".spec.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "coverageDirectory": "../coverage",
    "testEnvironment": "node",
    "moduleNameMapper": {
      "^src/(.*)$": "<rootDir>/$1"
    }
  }

这是带有 beforeEach 评论和没有 beforeEach 评论的结果

# With beforeEach

PASS  src/tasks/tasks.service.spec.ts (7.214 s)
  tasks.service
    Test
      ✓ pass (10 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        7.241 s
Ran all test suites.

Watch Usage: Press w to show more.
# Without beforeEach

PASS  src/tasks/tasks.service.spec.ts
  tasks.service
    Test
      ✓ pass (2 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.561 s, estimated 8 s
Ran all test suites.

Watch Usage: Press w to show more.

欢迎任何提示或帮助 :-) 谢谢!

【问题讨论】:

    标签: jestjs nestjs


    【解决方案1】:

    在一个新项目中,添加一个计时命令来检查总时间,我发现beforeEach 挂钩大约需要 2 到 10 毫秒才能运行。整个测试套件花费了大约 20 毫秒,而 Jest 报告说测试从开始到停止总共花费了 3.20 秒。如果有的话,我会说问题出在 Jest 这边。

    有问题的测试,如果你好奇的话:

    import { Test, TestingModule } from '@nestjs/testing';
    import { BarService } from './bar.service';
    
    describe('BarService', () => {
      let service: BarService;
    
      beforeAll(() => {
        console.time(BarService.name);
      });
    
      afterAll(() => {
        console.timeEnd(BarService.name);
      });
    
      beforeEach(async () => {
        console.time('beforeEach')
        const module: TestingModule = await Test.createTestingModule({
          providers: [BarService],
        }).compile();
    
        service = module.get<BarService>(BarService);
        console.timeEnd('beforeEach');
      });
    
      it('should be defined', () => {
        expect(service).toBeDefined();
      });
      it('expect true', () => {
        expect(true);
      });
    });
    

    还有 Jest 的输出:

    $ jest bar.service
     PASS  src/bar/bar.service.spec.ts
      BarService
        ✓ should be defined (14 ms)
        ✓ expect true (3 ms)
    
      console.time
        beforeEach: 9 ms
    
          at Object.<anonymous> (bar/bar.service.spec.ts:22:13)
    
      console.time
        beforeEach: 2 ms
    
          at Object.<anonymous> (bar/bar.service.spec.ts:22:13)
    
      console.time
        BarService: 17 ms
    
          at Object.<anonymous> (bar/bar.service.spec.ts:12:13)
    
    Test Suites: 1 passed, 1 total
    Tests:       2 passed, 2 total
    Snapshots:   0 total
    Time:        2.554 s, estimated 3 s
    Ran all test suites matching /bar.service/i.
    Done in 3.20s.
    

    测试在以下架构上运行:

    Linux/linux x64 5.4.0-42-generic ~Intel(R) Core(TM) i3-8130U CPU @ 2.20GHz (cores/threads): 4
    

    这是link to the git repo。我创建了一个新项目

    nest new quick-test -p npm
    

    添加了console.timeconsole.timeEnd 并运行npm run test

    【讨论】:

    • 嘿,感谢您的宝贵时间!你有你的源代码的 github,以便我可以比较你的表现和我的表现吗?
    • 我没有,但我可以设置一个。
    • 那太好了?
    【解决方案2】:

    beforeEach 函数的末尾尝试return

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多