全球化之前和之后的量角器

时间:2015-11-06 11:59:12

标签: javascript selenium protractor

在每个规范中,我都有beforeEachafterEach语句。是否有可能以某种方式在全局添加它以避免规范之间的代码重复?

2 个答案:

答案 0 :(得分:3)

beforeEach()afterEach()函数的目的是添加每次启动或完成每个规范(it)时需要执行的重复代码块。还有其他方法可以添加通用代码以避免代码重复,这里有一些 -

  • 如果您有一段代码需要在启动测试套件(describe)之前只运行一次,那么您可以使用jasmine提供的beforeAll()afterAll()函数。
  • 如果要在启动所有测试脚本之前运行一段只想执行一次的代码,请将其添加到onPrepare()onComplete()函数中。
  • 如果您想添加一段代码,即使在量角器开始实例化之前或者自己关闭之后也应该运行,然后使用beforeLaunchafterLaunch

所以这一切都取决于你想要使用它们的场景。希望它有所帮助。

答案 1 :(得分:0)

我的团队也希望在每个测试文件的开头运行样板代码。在这里的讨论中,听起来好像没有要全局添加到beforeEach()afterEach()等的钩子。

但是,我们要做使用onPrepare()函数来简化每个规格文件中重复的样板代码之前/之后的数量。以下是一个beforeAll()示例,但是该模式可以用于beforeEach()/afterEach()。在这种情况下,我们将使用DataSeeder类在数据库中设置测试用户,我们在每个spec文件的最外面的describe()块中进行此操作。 (我也将继续使用catchProtractorErrorInLocation模式,因为它对我们非常有用。)

在protractor.conf.ts中,将样板代码添加到browser.params对象中。

  onPrepare: function () {
    ...
    const browser = require('protractor').browser;
    // Define the ConsoleHelper & DataSeeder instances, which will be used by all tests.
    const DataSeeder = require('./e2e/support/data-seeder.js');
    browser.params.dataSeeder = new DataSeeder();

    browser.catchProtractorErrorInLocation = (error, location) => {
      throw new Error(`Error in ${location}\n     ${error}`);
    };
    browser.catchProtractorErrorInBeforeAll = (error) => browser.catchProtractorErrorInLocation(error, 'beforeAll()');

    // Return a promise that resolves when DataSeeder is connected to service and ready to go
    return browser.params.dataSeeder.waitForConnect();
  },

有了这些,我们可以轻松地在一组简短的行中进行beforeAll()设置代码。

  beforeAll(() => {
    return browser.params.dataSeeder.createTestUsers()
      .catch(browser.catchProtractorErrorInBeforeAll);
  });

您显然需要在设置中执行其他操作,但是您可以看到该模式如何应用。