ng test和ng e2e之间的真正区别是什么?

Jim*_*m C 31 jasmine protractor karma-jasmine angular-cli angular

我担心有人会提出我的问题,但我找不到令人满意的问题(也许是因为我在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);
    
    Run Code Online (Sandbox Code Playgroud)
  • 您使用量角器执行端到端测试主要是在部署应用程序后的一种预生产环境

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

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

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

...
Run Code Online (Sandbox Code Playgroud)

我重新阅读了一些类似"量角器在测试执行期间提供等待/睡眠行为"的内容,但是当我看到没有量角器完成的测试时,我无法看到这个聚合值的位置能够模拟最终用户.只要您对测试进行编码以完成与最终用户完全相同的流程,它将与Angular Cli创建的e2e文件夹中的e2e测试建议相同.

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

同样,我希望看到这是一个有关didatic目的的澄清问题:没有意图在这里比较框架.

Ale*_*net 43

你正走在了解所有这一切的好路上.

  • Ng测试(通过Karma启动的Jasmine + Angular Testing Utilities测试):

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

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

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

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

Protractor是Angular和AngularJS应用程序的端到端测试框架.量角器针对在真实浏览器中运行的应用程序运行测试,并以用户的身份与其进行交互.

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

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

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

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

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

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

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


结论:

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

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

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

希望这可以帮助.

  • 什么是"e2e测试预计会被污染"和"有一些交叉污染的风险"是什么意思?(我甚至不能猜到你的想法) (4认同)