【问题标题】:what is the real difference between ng test and ng e2eng test 和 ng e2e 之间的真正区别是什么
【发布时间】:2018-06-12 08:08:35
【问题描述】:

恐怕有人结束了我的问题,但我找不到令人满意的问题(可能是因为我在 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);
    
  • 您主要在将应用程序部署到一种预生产环境后使用量角器执行端到端测试

  • 触发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");
});

...

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

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

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

【问题讨论】:

  • 我相信您总结得非常详细,但不清楚您是如何得出这样的结论的,如 幕后并没有发生什么真正不同的事情。后者是不涉及 TestBed 的黑盒测试,几乎在生产环境中执行。前者则相反。它们是服务于不同目的的不同事物。如果您对单元测试、集成测试和 e2e 测试之间的区别感到困惑,那么有很多关于该主题的已回答问题。
  • 我完全同意 estus 的评论。我添加了一个答案,以提供一些可以帮助您理解整个事情的元素。

标签: angular jasmine protractor angular-cli karma-jasmine


【解决方案1】:

你在理解这一切的好路上。

  • Ng 测试(通过 Karma 启动的 Jasmine + Angular 测试实用程序测试):

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

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

目的是检查单个组件(单元测​​试)或多个模块/组件(集成测试)单个功能/小型工作流程是否按预期正常工作而没有副作用。

  • Ng E2E(茉莉花 + 量角器):

Protractor 是 Angular 和 AngularJS 的端到端测试框架 应用程序。 Protractor 针对正在运行的应用程序运行测试 在真实的浏览器中,像用户一样与之交互。

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

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

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

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

请记住,对于测试来说,有一个非常重要的比率是非常合乎逻辑的:

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

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


结论:

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

注意:也要注意这些点:

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

希望这会有所帮助。

【讨论】:

  • 未提及的重要实际区别是,e2e 测试预计不会受到污染、速度较慢且运行相对较少。虽然单元测试速度很快,并且可以在任何情况下运行,但存在一定的交叉污染风险。这可以通过为两种情况(量角器/Jasmine 与 Karma/Jasmine/TestBed)正确选择工具来保证。
  • “e2e 测试预计不会受到污染”和“存在交叉污染风险”是什么意思? (我什至猜不出你在想什么)
  • 我相信这与我所说的“副作用”有关。您在模块/组件中测试您的功能,以确保达到所需的行为。这是确保您编写的代码除了其目的之外没有任何副作用的最佳方法。由于端到端测试是通过用户交互模拟进行的,因此您不必测试按钮应该做什么,因为您之前应该使用单元测试对其进行过测试。这意味着如果事先正确测试,就不会产生副作用。我想这有点模糊,但希望它有所帮助
猜你喜欢
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 2018-04-19
  • 2015-01-11
  • 2012-09-07
相关资源
最近更新 更多