恐怕有人回答了我的问题,但我找不到令人满意的问题(也许是因为我在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文件夹下的测试,并将结果打印在命令行控制台


  • 从理论上讲,第二个特定于端到端,其中重点是模拟最终用户完成的整个流程。

    希望,直到这里是正确的,我想知道幕后发生的事情真正使他们与众不同。我不想比较哪个更好,但是我肯定会以某种方式遗漏一点,因为我使用最终用户所做的完全相同的想法创建了很少的测试,并通过ng test触发了它。

    例如:
    ...
    
    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测试(通过Karma启动的Jasmine + Angular Testing实用程序测试):

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

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

    目的是检查单个功能(小的测试)或单个功能/小型工作流程是否按预期正确工作且没有副作用的多个模块/组件(集成测试)。
  • Ng E2E( Jasmine + Protractor ):



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

    这非常重要,因为这意味着两件事:
  • 单元测试和集成测试正在使用静态的模拟数据来运行测试。
  • Protractor 测试使用的是真实数据,并执行HTTP(或您正在使用的任何方法)调用以获取数据并使用/测试数据。

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

    请记住,有一个非常重要的比率对于测试非常合乎逻辑:
  • 单元测试应占您测试的70%。
  • 集成测试应占您测试的20%。
  • E2E测试应占您测试的10%。

  • 这是为什么 ?因为如果您对许多组件进行了正确的单元测试,则无需在端到端测试中再次进行测试。

    结论:
  • 它们的操作方式不同,目的是测试不同的事物(单元功能/完整工作流程)。
  • 它们是互补的,这意味着,如果您仅实现单元/集成测试,则将无法保证工作流程可以从A到Z正常工作。而且,如果您仅编写E2E测试,您将永远无法确认工作流程中没有副作用。


  • N.B. :请注意以下几点:

    可以随意自定义
  • Jasmine,Karma和Protractor,因此您可以将它们输出为可以由Jenkins作业处理的XML文件而不是不实际的命令行。
  • 是的,您可以为两者编写相同的代码并有效地测试同一件事,但请记住,您想要的是提高效率并编写可维护的测试代码。我所说的比率非常重要。

  • 希望这可以帮助。

    关于angular - ng test和ng e2e之间的真正区别是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48064021/

    10-11 13:05