Angular ng测试和ng e2e之间的真正区别是什么

Angular ng测试和ng e2e之间的真正区别是什么,angular,jasmine,protractor,angular-cli,karma-jasmine,Angular,Jasmine,Protractor,Angular Cli,Karma Jasmine,我担心有人接近了我的问题,但我找不到一个令人满意的问题(可能是因为我在Angular 2+世界中非常有限,我理解了一些错误) 据我所知,在完成了几次Hello World和观看了几次YouTube演示后: ng测试: 您使用Jasmine语言编写测试 您可以使用Karma在许多可用的浏览器中测试您的测试 您可以执行单元测试或集成测试 运行所有xxx.component.spec.ts并在浏览器中显示类似于JUnit的最终报告 ng e2e: 您使用Jasmine语言编写测试 您可以使用Ka

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

据我所知,在完成了几次Hello World和观看了几次YouTube演示后:

ng测试:

  • 您使用Jasmine语言编写测试
  • 您可以使用Karma在许多可用的浏览器中测试您的测试
  • 您可以执行单元测试或集成测试
  • 运行所有
    xxx.component.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);
    
  • 您主要在将应用程序部署到一种预生产环境之后,使用量角器执行端到端测试

  • 将触发e2e文件夹下的测试,并在命令行控制台中打印结果
理论上说,第二个是特定于端到端的,重点是模拟由最终用户完成的整个流程

希望,直到这里是正确的,我想知道什么是幕后发生的,真正使他们不同。我不想比较哪一个更好,但我确实忽略了一些要点,因为我使用最终用户完全相同的想法创建了一些测试,并通过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");
});

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

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


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

您已经走上了理解所有框架的好道路

  • Ng测试(通过Karma启动的Jasmine+角度测试实用程序测试):
您正在使用jasmine框架编写测试,并将其定义为套件,期望得到可以测试的结果,但最主要的是,您实际上正在使用karma launcher直接在浏览器上执行测试。这是在angular应用程序中正常配置的

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

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

  • Ng E2E(茉莉花+量角器):
量角器是一种端到端的角度和角度测试框架 应用。量角器对正在运行的应用程序运行测试 在一个真正的浏览器中,与它进行用户交互

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

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

  • 单元测试和集成测试使用静态模拟数据来运行测试
  • 量角器测试使用真实数据,并执行HTTP(或任何您正在使用的)调用来获取数据并使用/测试它
  • 使用量角器的目的是验证应用程序中的完整操作工作流。例如,我将为我的登录组件编写单元测试,为我的登录服务编写单元测试,为我的整个模块编写集成测试,以及任何需要测试的行为,这些行为取决于几个组件/服务。完成后,我将在稍后编写一个完整的端到端测试,该测试将在我的应用程序中验证我的整个身份验证过程

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

    • 单元测试应该代表70%的测试
    • 集成测试应占测试的20%
    • E2E测试应占您测试的10%
    为什么呢?因为如果您对很多组件进行了正确的单元测试,那么您就不需要在端到端测试中再次进行单元测试


    结论:

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

    注意:还要注意以下几点:

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

    希望这能有所帮助。

    我相信你总结得相当接近,不清楚你是如何得出这样一个结论的,即幕后没有什么真正不同的事情发生。后者是不涉及测试床的黑盒测试,在