繁体   English   中英

赛普拉斯:自定义命令返回数组:如何循环运行测试套件?

[英]Cypress: Custom command returns array: How loop to run test suite?

问题:

尝试在从赛普拉斯自定义命令返回的项目数组中调用测试。

尝试使用npm package mocha-each和使用forEach function 的另一个测试的方法。

自定义命令:

我创建了一个自定义 Cypress 命令,该命令返回AppParamsType数组:

/// <reference types="Cypress" />

import { AppParamsType } from 'support';

declare global {
  namespace Cypress {
    interface Chainable {
      cmdGetAppsParams: () => Chainable<AppParamsType[]>;
    }
  }
}

export function cmdGetAppsParams() {
  const paramsApps: AppParamsType[] = [];

  cy.cmdAppKeys()
    .then(($appKeys: string[]) => {
      cy.wrap($appKeys).each(($appKey: string) => {
        cy.cmdProviderAppParams($appKey).then((paramApp: AppParamsType) => {
          paramsApps.push(paramApp);
        });
      });
    })
    .then(() => {
      return cy.wrap(paramsApps);
    });
}

Cypress.Commands.add('cmdGetAppsParams', cmdGetAppsParams);

使用自定义命令进行测试:

以下赛普拉斯测试调用自定义命令cmdGetAppsParams()以返回项目数组。

正在迭代该阵列,其中一项测试使用npm package mocha-each和另一项测试使用Array forEach 两种方法都没有调用循环内的测试。

import * as forEach from 'mocha-each';

let apps: AppParamsType[];

describe('DESCRIBE Apps Add Apps Spec', () => {
  before('BEFORE', () => {
    cy.cmdGetAppsParams().then(($apps: AppParamsType[]) => {
      expect($apps).to.be.an('array').not.empty;
      apps = $apps;
    });
  });

  it('TEST Apps Params Array', () => {
    cy.task('log', { line: 'A', data: apps });
    expect(apps).to.be.an('array').not.empty;
  });

  it('TEST each item mocha forEach', () => {
    cy.task('log', { line: 'B', data: apps });
    forEach(apps).it('item', (item: AppParamsType) => {
      cy.task('log', { line: 'B.1', data: item });
      expect(item).to.be.an('object').not.null;
    });
  });

  it('TEST each item array forEach', () => {
    cy.task('log', { line:'C', data: apps });
    expect(apps).to.be.an('array').not.empty;
    apps.forEach((item: AppParamsType) => {
      it('TEST App Param', () => {
        cy.task('log', { line: 'C.1', data: item });
        expect(item).to.be.an('object').not.null;
      });
    });
  });

我看到的结果是,由标签'A''B''C'指示的外部测试正在被调用。 但是,不是内部测试,这将由标签'B.1''C.1'表示:

{
  "line": "A",
  "data": [
    ***
  ]
}
{
  "line": "B",
  "data": [
    ***
  ]
}
{
  "line": "C",
  "data": [
    ***
  ]
}

it()中嵌套it()看起来很新颖。 我很惊讶你没有从中得到错误。

动态生成测试的基本问题是 Cypress 运行程序需要在开始运行测试之前准确知道将生成多少测试。 但是任何 Cypress 命令(包括自定义命令)在整个测试脚本完成运行(不包括回调代码)之前都不会运行,因此您无法从自定义命令中获取apps列表。

The best way to proceed is to convert cy.cmdAppKeys() , cy.cmdGetAppsParams() , and cy.cmdProviderAppParams() from custom commands to a plain javascript function, and then run that function at the top of the script, eg

const apps = getMyApps();  // synchronous JS function, 
                           // will run as soon as the test starts

apps.forEach((item: AppParamsType) => {

  const titleForTest = `Test App Param ${item.name}`; // Construct an informative title
  it(titleForTest, () => {
    ...
  })
})

如果您可以提供自定义命令cy.cmdAppKeys()cy.cmdProviderAppParams()的详细信息,或许可以帮助转换为同步 function。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM