使用CodeceptJS将测试名称推送到Sauce Labs

时间:2018-04-11 17:31:20

标签: selenium webdriver-io saucelabs codeceptjs

我一直试图让Sauce Labs报告使用CodeceptJS运行的测试的名称,但到目前为止我只能报告成功/失败。

我按照以下主题作为指南,帮助向Sauce Labs报告任何内容:https://github.com/Codeception/CodeceptJS/issues/371

我发现的片段如下:

_after() {
  if (process.env.SAUCE_USERNAME) {
    var sessionId = this.helpers['WebDriverIO'].browser.requestHandler.sessionID;
    var sauce_url = "Test finished. Link to job: https://saucelabs.com/jobs/";
    sauce_url = sauce_url.concat(sessionId);
    console.log(sauce_url);


    var dataString = '{"passed": true}';
    var status_url = 'https://saucelabs.com/rest/v1/';
    status_url = status_url.concat(process.env.SAUCE_USERNAME);
    status_url = status_url.concat('/jobs/');
    status_url = status_url.concat(sessionId);

    var options = {
      url: status_url,
      method: 'PUT',
      body: dataString,
      auth: {
        'user': process.env.SAUCE_USERNAME,
        'pass': process.env.SAUCE_ACCESS_KEY
      }
    };

    function callback(error, response, body) {
      if (!error && response.statusCode == 200) {
        console.log(body);
      }
    }

    request(options, callback);
  }
}

这里的问题是我不知道如何从这里访问测试名称,也不知道如何获得测试的状态(通过/失败)。

我已经了解到,通过帮助程序,您可以在测试通过或测试失败时调度事件。我创建了一个新文件,确保将其添加到配置的hooks部分,并添加了事件调度程序。这很好,因为现在我可以访问测试对象,但以下代码不起作用:

event.dispatcher.on(event.test.failed, function(test, testError) {
  console.log("TEST FAILED...");
  console.log(this.helpers["WebDriverIO"]);
  var sessionId = this.helpers["WebDriverIO"].browser.requestHandler
    .sessionID;
  console.log(sessionId);
  var sauce_url = "Test finished. Link to job: https://saucelabs.com/jobs/";
  sauce_url = sauce_url.concat(sessionId);
  console.log(sauce_url);

  var dataString = `{"passed": false, "name": "${
    test.title
  }","customData": { "error": ${test.steps} }}`;
  var status_url = "https://saucelabs.com/rest/v1/";
  status_url = status_url.concat(process.env.CLOUDSERVICE_USERNAME);
  status_url = status_url.concat("/jobs/");
  status_url = status_url.concat(sessionId);

  var options = {
    url: status_url,
    method: "PUT",
    body: dataString,
    auth: {
      user: process.env.CLOUDSERVICE_USERNAME,
      pass: process.env.CLOUDSERVICE_KEY
    }
  };

  function callback(error, response, body) {
    if (!error && response.statusCode == 200) {
      console.log(body);
    }
  }

  request(options, callback);
});

它不起作用的原因是因为以下行似乎不起作用:

var sessionId = this.helpers['WebDriverIO'].browser.requestHandler.sessionID;

具体来说,this.helpers['WebDriverIO']没有打印到我的控制台,导致我相信它不能从帮助程序上下文中运行。

是否有某种方法可以从事件调度的上下文中检索测试的会话ID?测试文档似乎表明还有其他属性,但没有列出它们。以下是参考文档:https://codecept.io/hooks/#api

提前致谢!

1 个答案:

答案 0 :(得分:1)

看起来您可以使用saucelab s包来处理这个问题。

设置并先授权

const SauceLabs = require('saucelabs')

saucelabs = new SauceLabs({
  username: your-username,
  password: your-accessKey
});

然后一旦测试完成,您可以将结果发布回SauceLabs,如下所示:

saucelabs.updateJob(sessionID, {
  name: test-title,
  passed: passed
}, done);