动态确定从数据库

时间:2017-03-20 16:08:11

标签: javascript node.js selenium nightwatch.js

我正在为我们的某个网站设置夜间测试并对其进行结构化,以便我们测试人员也可以分配测试。只要我们只在开发环境中运行测试,这一切都很有效。不幸的是,我们希望根据正在执行的环境动态设置角色的属性以及他们需要执行哪些测试。

问题是,在测试集合组装之前,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类:

/// <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个测试数)阻止守夜人执行直到他们完全完成的方式,以便守夜人看到他们。

非常感谢任何见解!

1 个答案:

答案 0 :(得分:0)

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