将Intern与Selenium和动态proxyUrl结合使用

时间:2014-04-01 13:37:35

标签: javascript unit-testing selenium-grid automated-tests intern

我的配置是由grunt和以下实习配置(部分)启动的实习测试环境:

proxyPort: 9000,
proxyUrl: 'http://<my-ip>:9000',

问题是硬编码的my-ip。 Selenium网格和节点在不同的机器/相应的ips上运行,实习生的配置文件将与所有构建和测试环境一起检入。

如果我将proxyUrl留在localhost,那么selenium节点就无法加载实习测试的数据。

因此,对于所有开发人员测试,my-ip都会有所不同。我真的不希望每个人都把自己的ip输入到实习配置中,并且意外地检查配置,既不检查模板文件也不能让每个人都改变。

不要理解我的错。设置工作正常,但本地IP必须输入硬编码,我个人认为是气味。

也许很容易将proxyURL参数化,但我无法找到任何资源:(

问候,

Flowkap

2 个答案:

答案 0 :(得分:1)

从Intern 1.6开始,您可以从intern.args检索其他命令行参数:

// in tests/config.js
define([ 'intern' ], function (intern) {
  return {
    proxyUrl: intern.args.proxyUrl,

    // ... additional configuration ...
  };
});
$ intern-runner config=tests/config proxyUrl=http://www.example.com:1234/

答案 1 :(得分:1)

我发现了如何通过使用node.net文档http://nodejs.org/api/os.html#os_os_networkinterfaces中描述的os.networkInterfaces()来轻松获取当前的LAN ip。{/ p>

因此,如果需要为intern.js的静态proxyUrl配置标志自动动态获取localLan ip,我们只需在例如定义中添加相应的代码。您的Gruntfile作为Grunt本身正在nodejs环境中执行:

/* jshint node: true*/
"use strict";
module.exports = function (grunt) {
    require("time-grunt")(grunt);

    var os = require('os');
    var interfaces = os.networkInterfaces(),
        localLanIp = null,
        setLocalLanIp = function (deviceDetails) {
            if (deviceDetails.family === 'IPv4' && !deviceDetails.internal) {
                localLanIp = deviceDetails.address;
            }
            return localLanIp !== null;
        };

    for (var device in interfaces) {
        //just check devices containing LAN or eth
        if (device.indexOf("LAN") > -1 || device.indexOf("eth") > -1) {
            //as we can'T break a forEach on arrays we use some and break on return true.
            interfaces[device].some(setLocalLanIp);
            //break outer for as loaclIp is found.
            if (localLanIp !== null) {
                break;
            }
        }
    }

    //if no ip found default to localhost anyway.
    if  (localLanIp === null) {
        localLanIp = "localhost";
    }

    grunt.initConfig({

        intern: {
            remote: {
                options: {
                    runType: "runner",
                    config: "tests/intern.js",
                    reporters: [ "console" ],
                    suites: [ "tests/module" ],
                    proxyPort: 9000,
                    proxyUrl: 'http://' + localLanIp + ':' + 9000
                }
            }
        }
    });
    grunt.loadNpmTasks("intern");
    grunt.registerTask("default", ["intern"]);
};

在我看来默认为本地局域网ip会是一个好主意,但如果您不能依赖localhost或0.0.0.0地址但不想手动编辑任何配置(或者不能因任何原因)。