从数据库中动态确定哪些 Nightwatch.js 测试 运行

Dynamically determining which Nightwatch.js tests to run from database

我正在为我们的一个站点设置守夜人测试并构建它们,以便我们拥有测试角色,我们也分配测试。这一切都很好,只要我们只 运行 我们在开发环境中的测试。不幸的是,我们想要动态设置角色的属性以及他们需要根据他们正在执行的环境执行哪些测试。

问题是 nightwatch 在测试集合组装之前触发,因此它看不到 运行 的测试。我想延迟 nightwatch 从开始到一切都完全生成之后。

这是一个角色示例:

/// <reference path="../../basepersona.ts" />
/// <reference path="../../Utilities.ts" />
namespace Tests {
export class Dealer_Persona extends BasePersona {
    constructor() {
        super("Dealer");

        var setParameters = function (persona, results, testsCallback, getTests) {
            results.forEach((param) => {
                switch (param.ParameterName) {
                    case "UserName":
                        persona.UserName = param.ParameterValue;
                        break;
                    case "Password":
                        persona.Password = param.ParameterValue;
                        break;
                    case "CreditCardNumber":
                        persona.CreditCardNumber = param.ParameterValue;
                        break;
                    case "CreditCardExpireMonth":
                        persona.CreditCardExpireMonth = param.ParameterValue;
                        break;
                    case "CreditCardExpireYear":
                        persona.CreditCardExpireYear = param.ParameterValue;
                        break;
                    case "CreditCardCVV":
                        persona.CreditCardCVV= param.ParameterValue;
                        break;
                }
            });

            getTests(persona, testsCallback);


        }

        this.DAL.GetParametersForPersona(this, setParameters, this.DAL.SetTestsForPersona, this.DAL.GetTestsForPersona);

    }
}
}


var persona = new Tests.Dealer_Persona();

这是一个非常基本的角色,其中一些角色需要为其属性使用一些非常环境特定的值。此外,由于要正确加载角色需要发生多个回调,因此 GetParametersForPersona 方法必须接受多个回调函数并作为链中的第一步。

这是 DAL class:

/// <reference path="interfaces.ts" />
/// <reference path="../node_modules/@types/node/index.d.ts" />
/// <reference path="../node_modules/@types/mssql/index.d.ts" />
export class DALMethods {
    constructor() {
        var nextVal = false;
        process.argv.forEach(function (val, index, array) {
            if (nextVal) {
                site = val;
            }

            if (val.indexOf("site") > 0) {
                nextVal = true;                  
            }
        });

        var Setter = new Settings();

        Setter.SetVariables(site);
    }

    GetTestsForPersona(persona: BasePersona, callback): any {
        new sql.Request(connectionString)
            .input('persona', sql.VarChar(100), persona.Name)
            .input('environment', sql.VarChar(10), site)
            .execute('usp_AutomatedTesting_GetPersonaTests').then(function (recordsets) {
                callback(persona, recordsets[0]);
            }).catch(function (err) {
                // ... execute error checks 
            });
    }

    GetParametersForPersona(persona: BasePersona, callback, testsCallback, getTests): any {
        sql.connect(connectionString).then(function () {    
        new sql.Request()
            .input('persona', sql.VarChar(100), persona.Name)
            .input('environment', sql.VarChar(10), site)
            .execute('usp_AutomatedTesting_GetPersonaParameters').then(function (recordsets) {
                callback(persona, recordsets[0], testsCallback, getTests);
            }).catch(function (err) {
                console.log(err);
                });
        }).catch(function (err) {
            console.log(err);
        });
    }

    SetTestsForPersona(persona, results) {
        results.forEach((param) => {
            switch (param.TestName) {
                case "LoginFailure":
                    persona.Tests.push(new LoginFailure_Test(persona));
                    break;
                case "LoginGuestFailure":
                    persona.Tests.push(new LoginGuestFailure_Test(persona));
                    break;
                case "ShippingFailure":
                    persona.Tests.push(new ShippingFailure_Test(persona));
                    break;
                case "PaymentFailure":
                    persona.Tests.push(new PaymentFailure_Test(persona));
                    break;
                default:
                    console.log(param.TestName + " does not exist");
                    break;
            }
        });

        persona.Tests.forEach((x) => {
            Object.defineProperty(persona, x.Name, {
                value: x.Test,
                configurable: true, writable: true, enumerable: true
            });
        });

    }
}

我认为我的问题源于这样一个事实,即我不知道如何加载这些角色(其中有 23 个)、设置它们的参数并为它们分配测试(每个角色 n 个测试)以某种方式阻止 nightwatch 执行直到它们完全完成,以便 nightwatch 能够看到它们。

如有任何见解,我们将不胜感激!

我们最终使用gulp先编译所有TS,然后调用nightwatch。不是我所希望的,但它有效。