1
votes

I am putting together some ideas for our automated testing platform and have been looking at Selenium for the test runner.

I am wrapping the recorded Selenium C# scripts in an MbUnit test, which is being triggered via the MbUnit NAnt task. The Selenium test client is created as follows:

selenium = new DefaultSelenium("host", 4444, "*iexplore", "http://[url]/");

How can I pass the host, port and url settings into the test so their values can be controlled via the NAnt task?

For example, I may have multiple Selenium RC servers listening and I want to use the same test code passing in each server address instead of embedding the settings within the tests themselves.

I have an approach mocked up using a custom NAnt task I have written but it is not the most elegant solution at present and I wondered if there was an easier way to accomplish what I want to do.

Many thanks if anyone can help.

4

4 Answers

1
votes

Thanks for the responses so far.

Environment variables could work, however, we could be running parallel tests via a single test assembly so I wouldn't want settings to be overwritten during execution, which could break another test. Interesting line of thought though, thanks, I reckon I could use that in other areas.

My current solution involves a custom NAnt task build on top of the MbUnit task, which allows me to specify the additional host, port, url settings as attributes. These are then saved as a config file within the build directory and then read in by the test assemblies. This feels a bit "clunky" to me as my tests need to inherit from a specific class. Not too bad but I'd like to have less dependencies and concentrate on the testing.

Maybe I am worrying too much!!

1
votes

I have a base class for all test fixtures which has the following setup code:

    [FixtureSetUp]
    public virtual void TestFixtureSetup ()
    {
        BrowserType = (BrowserType) Enum.Parse (typeof (BrowserType),
            System.Configuration.ConfigurationManager.AppSettings["BrowserType"],
            true);
        testMachine = System.Configuration.ConfigurationManager.AppSettings["TestMachine"];
        seleniumPort = int.Parse (System.Configuration.ConfigurationManager.AppSettings["SeleniumPort"],
            System.Globalization.CultureInfo.InvariantCulture);
        seleniumSpeed = System.Configuration.ConfigurationManager.AppSettings["SeleniumSpeed"];
        browserUrl = System.Configuration.ConfigurationManager.AppSettings["BrowserUrl"];
        targetUrl = new Uri (System.Configuration.ConfigurationManager.AppSettings["TargetUrl"]);

        string browserExe;
        switch (BrowserType)
        {
            case BrowserType.InternetExplorer:
                browserExe = "*iexplore";
                break;
            case BrowserType.Firefox:
                browserExe = "*firefox";
                break;

            default:
                throw new NotSupportedException ();
        }

        selenium = new DefaultSelenium (testMachine, seleniumPort, browserExe, browserUrl);
        selenium.Start ();

        System.Console.WriteLine ("Started Selenium session (browser type={0})",
            browserType);

        // sets the speed of execution of GUI commands
        if (false == String.IsNullOrEmpty (seleniumSpeed))
            selenium.SetSpeed (seleniumSpeed);
    }

I then simply supply the test runner with a config. file:

0
votes

For MSBuild I use environment variables, I create those in my CC.NET config then they would be available in the script. I think this would work for you too.

0
votes

Anytime I need to integrate with an external entity using NAnt I either end up using the exec task or writing a custom task. Given the information you posted it would seem that writing your own would indeed be a good solution, However you state you're not happy with it. Can you elaborate a bit on why you don't think you current solution is an elegant one?

Update

Not knowing internal details it seems like you've solved it pretty well with a custom task. From what I've heard, that's how I would have done it.

Maybe a new solution will show itself in time, but for now be light on yourself!