如何将地图对象设置为赛普拉斯结果 json 文件

Posted

技术标签:

【中文标题】如何将地图对象设置为赛普拉斯结果 json 文件【英文标题】:How to set the map object into Cypress result json file 【发布时间】:2021-12-10 16:39:45 【问题描述】:

我正在使用 cypress runner 来执行 spec 文件并返回如下结果。

Runner.js:

const cypress = require('cypress');
const param = require("./cypress/support/Param");

async function testRunner(fixture) 
    return cypress.run(
      config: 
      ,
      env: 
        testcaseID: `$fixture`,
      ,
      spec: './cypress/integration/' + `$param.getSpec()` + ".spec.js",
    );
  

规格文件:

let map = new Map();

describe("How to add map values in the cypress result.json",() =>

    const baseUrl = "https://www.google.com/";

    const testData = Cypress.env('fixture')

    beforeEach("",()=>

        cy.visit(baseUrl);
    );

    it("Test Case1: Search the keyword", function () 
            cy.xpath("//input[@name='q']").type(testData.searchKeyword);
            map.set("UserInput",testData.searchKeyword); //It's just sample
            cy.xpath("//input[@value='Google Search']").click();
            map.set("customMessage","test"); //It's just sample but actual usecase is different
            cy.get("//ul/li[2]").should("be.visible");
    );

);

使用以下行在主运行器中获取结果:

result = await testRunner(dataSet[i]);
                    if (result.runs[0].stats.failures === 1) 
                        console.log(result);
                    

上面的代码工作正常,我可以得到包含测试用例是否通过/失败的 result.json。但除此之外,我只想添加更多存储在 Map 中的运行时值,并希望将它们添加到 Cypress.run 返回结果中。

有人可以建议我处理此问题的优化方法吗?如何获取地图中可用的一些运行时值,这些值将与 cypress 运行结果一起返回。

提前致谢。

更新:

我刚刚创建了一个 Map() 变量并使用 getter 和 setter 调用该变量,但仍然没有运气。

var EnumPojo = 
    
    LISTENER: new Map(),

    get listener()
    
        return this.LISTENER;
    ,

    set listener(value)
    
        return this.listener =value;
    ;


将上面的地图调用到脚本中:

const runtimeValues = require("../../EnumPojo.js");

 describe("How to add map values in the cypress result.json",() =>
    
        const baseUrl = "https://www.google.com/";
    
        const testData = Cypress.env('fixture')
    
        beforeEach("",()=>
    
            cy.visit(baseUrl);
        );
    
        it("Test Case1: Search the keyword", function () 
                cy.xpath("//input[@name='q']").type(testData.searchKeyword);
                runtimeValues.LISTENER.set("UserInput",testData.searchKeyword); //It's just sample
                cy.xpath("//input[@value='Google Search']").click();
                runtimeValues.LISTENER.set("customMessage","test"); //It's just sample but actual usecase is different
                cy.get("//ul/li[2]").should("be.visible");
        );
    
    );

跑步者:

 const runtimeValues = require("../../EnumPojo.js");

 result = await testRunner(dataSet[i]);
                        if (result.runs[0].stats.failures === 1) 
                            console.log(result);
                            console.log(runtimeValues.LISTENER);
                        

输出: 地图0

【问题讨论】:

【参考方案1】:

在测试中,将地图保存在fixtures下

it('my-test', function () 

  ...
  cy.fixture('map.json').then(mapData => 
    mapData['my-test'] = JSON.stringify(map)  // use unique key for this test
    cy.writeFile('./fixtures/map.json', JSON.stringify(mapData))
  )
)

在跑步者中,

const fs = require('fs')

cypress.run(...)
  .then(result => 
    const mapData = fs.readFileSync('./cypress/fixtures/map.json')  // adjust path to where script is
    /*
      mapData is 
        'my-test':  ...data here ,
        'other-test':  ...data here ,
      
    */   
   )

但是 javascript Map 可能无法正确序列化,最好在保存前转换为对象。

【讨论】:

感谢分享代码。我有很多与套件相关的测试,还有其他方法可以在 cypress runner 的结果中附加一些自定义变量作为键值对吗? 您的运行器代码看起来像是一次执行一个规范,但如果您希望每次测试都有额外的数据,我会给出修正。

以上是关于如何将地图对象设置为赛普拉斯结果 json 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用赛普拉斯测试文件输入?

如何将环境变量添加到服务器,由赛普拉斯测试运行?

如何通过将赛普拉斯指定为项目来运行特定的测试文件夹?

如何在赛普拉斯中使用灯具列表断言列表

如何将环境名称传递给赛普拉斯测试以加载一组环境变量?

赛普拉斯报告者结果文件名