我担心有人接近我的问题,但我找不到一个满意的问题(可能是因为我在Angular 2+世界中非常有限,我理解了一些错误).

据我所知,在《Hello World》的制作和YouTube演示的观看很少之后:

ng测试:

  • 你用Jasmine语言写测试
  • 您可以使用Karma在许多可用的浏览器上测试您的测试
  • 您可以执行单元测试或集成测试
  • 所有xxx.compnent.spec.ts次运行后,类似于JUnit的最终报告将显示在浏览器中

Ng e2e:

  • 你用Jasmine语言写测试
  • 您可以使用Karma在许多可用的浏览器上测试您的测试
  • 编写测试时,要考虑嵌套用户事件

    eg. page.navigateTo();
    page.getParagraphText()
      .then(msg => expect(msg).toEqual('Welcome to app!!'))
      .then(msg => expect(msg).toEqual('xxx'))
      .then(done, done.fail);
    
  • 主要是在将应用程序部署到一种预生产环境之后,使用 protractor 执行端到端测试

  • 将触发e2e文件夹下的测试,并在命令行控制台中打印结果

理论上说,第二个是特定于端到端的,重点是模拟最终用户完成的整个流程.

希望,直到这里是正确的,我想知道什么是幕后发生的,真正使他们不同.我不想比较哪一个更好,但我确实忽略了一些要点,因为我使用最终用户完全相同的 idea 创建了一些测试,并通过ng测试触发了它.

例如:

...

it('should display the modal when `create Paste` is clicked', () => {

    let createPasteButton = fixture.debugElement.query(By.css("button"));
    //create a spy on the createPaste  method
    spyOn(component,"createPaste").and.callThrough();

    //triggerEventHandler simulates a click event on the button object
    createPasteButton.triggerEventHandler('click',null);

    //spy checks whether the method was called
    expect(component.createPaste).toHaveBeenCalled();
    fixture.detectChanges();
    expect(component.showModal).toBeTruthy("showModal should now be true");
    expect(element.innerHTML).toContain("source-modal");
});

...

我记得我读过类似" protractor 在测试执行期间提供等待/睡眠行为"的内容,但当我看到在没有 protractor 的情况下完成测试时,我看不出这个聚合值在哪里,也无法模拟最终用户.只要您将测试编码为与最终用户完成的流程完全相同,它将与Angular Cli创建的e2e文件夹下的e2e测试建议相同.

如果我的研究促使我正确理解上面的内容,那么唯一真正的区别就是我作为开发人员组织测试的方式.在幕后发生的事情并没有什么不同.

再一次,我希望将此视为澄清问题的目的:这里根本没有比较框架的意图.

推荐答案

你正在很好的道路上理解这一切.

  • Ng test (Jasmine + Angular Testing Utilities tests launched through Karma):

您正在使用jasmine框架编写测试,并将它们定义为套件并期望您可以测试的结果,但最主要的是您实际上正在使用karma启动器直接在浏览器上执行测试.这是在Angular 应用程序中正常配置的.

这意味着只有一台服务器在运行测试,就是这样.您可以使用自己的值进行测试,并判断组件是否正常工作.

其目的是判断单个组件(单元测试)或多个模块/组件(集成测试),以确保单个功能/小型工作流按预期正常工作,且无副作用.

  • Ng E2E (Jasmine + Protractor) :

protractor 是一种端到端的Angular 和Angular 测试框架

在这里,您编写的测试将充当用户.这意味着您的应用程序正在浏览器中运行,另一个程序将对您的应用程序运行测试,模拟用户交互.

这非常重要,因为这意味着两件事:

  1. 单元测试和集成测试使用静态模拟数据来运行测试.
  2. protractor 测试使用真实数据,并执行HTTP(或您正在使用的任何东西)调用来获取数据并使用/测试它.

Digrator的目的是验证应用程序中的完整操作工作流.例如,我将为我的登录组件编写单元测试,为我的登录服务编写单元测试,为我的整个模块编写集成测试,以及我需要测试的依赖于多个组件/服务的任何行为.完成后,我将稍后编写一个完整的端到端测试,以验证我在应用程序中的整个身份验证过程.

请记住,测试中有一个非常重要的比率,这是非常合乎逻辑的:

  • 单元测试应该占测试的70%.
  • 集成测试应占测试的20%.
  • E2E测试应占您测试的10%.

为什么?因为如果你对很多组件进行了正确的单元测试,你就不需要在端到端测试中再次进行测试.


Conclusion :

  • 它们的操作方式不同,目的是测试不同的东西(单元功能/完整的工作流程).
  • 它们是互补的,这意味着如果您只实现单元/集成测试,您将永远无法保证工作流将从A到Z工作;如果您只编写E2E测试,您将永远无法确认您的工作流中没有副作用.

N.B. :还要注意以下几点:

  • Jasmine、Karma和Digrator可以随意定制,因此您可以将它们输出到XML文件中,该文件可以由Jenkins作业(job)处理,而不是不实用的命令行.
  • 是的,您可以为这两种语言编写相同的代码,并有效地测试相同的东西,但请记住,您想要的是高效地编写可维护的测试代码.我提到的比率非常重要.

希望这有帮助.

Angular相关问答推荐

Angular - Bootstrap 5 Carbon不工作

Angular 17@在大小写时切换多个值

基于另一个控制值显示值的Angular 数组

笔刷Angular 为17

Angular 如何渲染ngFor?

如何使用formBuilder.Group()从角形表单中删除选定的选项?

是否可以在Angular(12+)中迭代指定的范围而不是整个数组

VS 2022 停留在运行 Angular 应用程序上

如果我使用 matAutocomplete,为什么 textarea 不显示 formControl 的实际值

Angular 2 二传手与 ngOnChanges

不再需要 core-js 了吗?

Angular 2+ 一次性绑定

Angular [disabled]="MyBoolean" 没有工作

如何使用Angular4通过元素ID设置焦点

即使 withCredentials 为真,Angular 也不会发送在 Set-Cookie 中收到的 Cookie

Angular 2 - 什么是Root Scope?

在同一个组件中使用 MatSort 的多个 mat-table

Angular 2 应用程序中没有Access-Control-Allow-Origin标头

动态添加/删除验证器

如何在 Angular 4 中翻译 mat-paginator?