Jasmine 量角器茉莉花记者+;BDD&x2B;天蓝德沃斯

Jasmine 量角器茉莉花记者+;BDD&x2B;天蓝德沃斯,jasmine,protractor,azure-devops,bdd,Jasmine,Protractor,Azure Devops,Bdd,我想用BDD风格编写Jasmine End 2 End测试。据我所知,这意味着我有四个方面: 特征 情景 刺激或事件 确保取得成果 从我的天真观点来看,我会为“个人细节”功能创建一个测试,如下所示: // Feature describe('Showing Individual Details', () => { let individualDetailsPage: IndividualDetailsPage; beforeEach(() => { indivi

我想用BDD风格编写Jasmine End 2 End测试。据我所知,这意味着我有四个方面:

  • 特征
  • 情景
  • 刺激或事件
  • 确保取得成果
从我的天真观点来看,我会为“个人细节”功能创建一个测试,如下所示:

// Feature
describe('Showing Individual Details', () => {
  let individualDetailsPage: IndividualDetailsPage;

  beforeEach(() => {
    individualDetailsPage = new IndividualDetailsPage();
  });

  // Scenario - New Individual
  describe('Given a new Individual', () => {
    beforeEach(async () => {
      await individualDetailsPage.navigateToDetails('-1');
    });

    // Incoming Event
    describe('When the Details are loaded', () => {
      // Ensure outcome
      it('Then all Controls are empty', async () => {
        expect(individualDetailsPage.firstNameInput.text).toBe('');
        expect(individualDetailsPage.lastNameInput.text).toBe('');
        expect(individualDetailsPage.birthdateInput.text).toBe('');
      });

      // Ensure outcome
      it('Then the save button is disabled', () => {
        expect(individualDetailsPage.saveButton.isEnabled).toBe(false);
      });
    });
  });
});
 <testsuite name="Showing Individual Details" timestamp="2019-02-04T18:23:33" hostname="localhost" time="2.035" errors="0" tests="0" skipped="0" disabled="0" failures="0">
 </testsuite>
 <testsuite name="Showing Individual Details.Given a new Individual" timestamp="2019-02-04T18:23:33" hostname="localhost" time="2.033" errors="0" tests="0" skipped="0" disabled="0" failures="0">
 </testsuite>
 <testsuite name="Showing Individual Details.Given a new Individual.When the Details are loaded" timestamp="2019-02-04T18:23:33" hostname="localhost" time="2.033" errors="0" tests="2" skipped="0" disabled="0" failures="0">
  <testcase classname="Showing Individual Details.Given a new Individual.When the Details are loaded" name="Then all Controls are empty" time="1.106" />
  <testcase classname="Showing Individual Details.Given a new Individual.When the Details are loaded" name="Then the save button is disabled" time="0.927" />
 </testsuite>
因此,对于“个人详细信息”功能,如果设置了新的个人,则控件应为空,并且“保存”按钮应被禁用。 从天真的角度来看,这似乎还不错。在运行测试时,我看到:

看起来不错。现在有趣的部分是:我想将此更改发布到Azure DevOps,因此我在量角器配置中使用以下代码:

  onPrepare() {
    require('ts-node').register({
      project: require('path').join(__dirname, './tsconfig.e2e.json')
    });
    var jasmineReporters = require('jasmine-reporters');
    var junitReporter = new jasmineReporters.JUnitXmlReporter({
      savePath: 'testresults',
      filePrefix: 'e2e-tests',
      consolidateAll: true
    });

    jasmine.getEnv().addReporter(junitReporter);
  }
不幸的是,XML看起来是这样的:

// Feature
describe('Showing Individual Details', () => {
  let individualDetailsPage: IndividualDetailsPage;

  beforeEach(() => {
    individualDetailsPage = new IndividualDetailsPage();
  });

  // Scenario - New Individual
  describe('Given a new Individual', () => {
    beforeEach(async () => {
      await individualDetailsPage.navigateToDetails('-1');
    });

    // Incoming Event
    describe('When the Details are loaded', () => {
      // Ensure outcome
      it('Then all Controls are empty', async () => {
        expect(individualDetailsPage.firstNameInput.text).toBe('');
        expect(individualDetailsPage.lastNameInput.text).toBe('');
        expect(individualDetailsPage.birthdateInput.text).toBe('');
      });

      // Ensure outcome
      it('Then the save button is disabled', () => {
        expect(individualDetailsPage.saveButton.isEnabled).toBe(false);
      });
    });
  });
});
 <testsuite name="Showing Individual Details" timestamp="2019-02-04T18:23:33" hostname="localhost" time="2.035" errors="0" tests="0" skipped="0" disabled="0" failures="0">
 </testsuite>
 <testsuite name="Showing Individual Details.Given a new Individual" timestamp="2019-02-04T18:23:33" hostname="localhost" time="2.033" errors="0" tests="0" skipped="0" disabled="0" failures="0">
 </testsuite>
 <testsuite name="Showing Individual Details.Given a new Individual.When the Details are loaded" timestamp="2019-02-04T18:23:33" hostname="localhost" time="2.033" errors="0" tests="2" skipped="0" disabled="0" failures="0">
  <testcase classname="Showing Individual Details.Given a new Individual.When the Details are loaded" name="Then all Controls are empty" time="1.106" />
  <testcase classname="Showing Individual Details.Given a new Individual.When the Details are loaded" name="Then the save button is disabled" time="0.927" />
 </testsuite>

由于Azure DevOps似乎只检查名称,因此我看到:

我的问题:我不知道我的问题在哪里。我没有找到任何关于Jasmine的“真实”BDD的好资源,而且Jasmine Reporter似乎不能配置太多:


因此,我的代码是完全错误的,还是事实上是记者?如果是这样的话,是否有其他选择,或者我是否需要以某种方式“扁平化”XML?

我同意上面的评论,创建自己的reporter听起来是一条路要走。您可以按自己喜欢的方式格式化内容

我最近回答了另一个关于Jasmine reporter的问题。我正在将测试结果重新格式化为JSON对象,并在每次测试完成后将其存储在amazons dynamoDB中


如果还有任何问题,请告诉我。

您可以使用useFullTestName属性:

jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
      consolidateAll: true,
      useFullTestName:true,
      savePath: 'e2e/output',
      filePrefix: 'xmlresults'
    }));

我建议使用Jasmine TRX Reporter而不是JUnit XML Reporter。 TRX Reporter还支持向发布的测试结果添加屏幕截图,这在CI/CD环境中是一个巨大的优势。 该屏幕截图将在Azure Devops中测试用例结果的附件选项卡下提供:

您可以通过以下方式将其添加到项目中:

npm install jasmine-trx-reporter --save-dev
并将其添加到量角器配置中,如下所示:

const TrxReporter = require('jasmine-trx-reporter');

...

    onPrepare() {

...

        jasmine.getEnv().addReporter(new TrxReporter({
            folder: require('path').join(__dirname, './testresults/'),
            takeScreenshotsOnlyOnFailures: true
        }));

...

最后但并非最不重要的一点是,将发布测试结果步骤更改为使用VSTest而不是JUnit,并使用导出的.trx文件而不是.xml文件。

您可以编写一个自定义报告程序,以按照您想要的方式格式化xml文件。这其实比你想象的要容易。查看这里了解如何开始,非常感谢。我觉得奇怪的是:Azure DevOps很受欢迎,量角器也很受欢迎。我不可能是第一个遇到问题的人,因为测试结果几乎毫无用处。不幸的是,我对Azure不太熟悉,但对AWS管道有一点经验。您的项目是否也在自动管道中,或者您是否手动上传结果以供Azure自行解释?如果是后者,则可以通过在conf文件中设置
resultJsonOutputFile:true
自动生成另一种格式的报告量角器。下面是我使用过的任务,但它会抛出警告消息##[警告]未找到与*/.trx匹配的测试结果文件。并且未显示结果-任务:PublishTestResults@2输入:testResultsFormat:'VSTest'testResultsFiles:'*/.trx'搜索文件夹:'$(Build.SourcesDirectory)'publishRunAttachments:true mergeTestResults:false failTaskOnFailedTests:true@PDTech看看PublishTestResults任务,您可能需要为“测试结果文件”微调glob。我刚刚用了**.trx