Run Canopy tests in parallel

I am using Canopy to run my tests, I was looking at running them in parallel so I set parallel flag to true in the config but it doesn’t seem to work. Could someone point me to a sample showing how to run tests in parallel?

Other thing I was looking at was to do some stress test by running multiple instances of chrome, could someone help me with that as well.

Hi @sandeepc24, there is a good example in the repo that you can use as a starting point: https://github.com/lefthandedgoat/canopy/tree/master/tests/paralleltests

The key concept is that the functions in the canopy.parallell.functions module all take a browser instance in the last position, so you can use normal functions like url, and just pass in an instance.

The other way you can use it is to instantiate a browser and use instance methods.

Both ways are shown in the functionsTests.fs and instanceTests.fs files respectively.

Hi Chethusk, thanks for the pointers. I tried using instance methods but it doesn’t work with Expecto. Only one test passes and the others seem to hang with following error

canopy.types+CanopyNoBrowserException: Can't perform the action because the browser instance is null.  `start chrome` to start a new browser.

Here is my test code

let startBrowser() =
    let browser = new Instance()
    browser.start Chrome // Use this if you want to see your tests in the browser
    //start ChromeHeadless
    browser.resize (1280, 960)
    browser

let startApp (browser : Instance)=
    browser.url serverUrl
    browser.waitForElement(".elmish-app")

let login (browser : Instance) =
    let logout = browser.someElement logoutLinkSelector 
    if logout.IsSome then
        browser.click logoutLinkSelector 
        browser.waitForElement loginLinkSelector

    browser.click loginLinkSelector

    "#email" << username
    "#password" << password

    browser.click "Login"
    browser.waitForElement logoutLinkSelector

let logout (browser : Instance) =
    browser.click logoutLinkSelector

let tests = 
    testList "client tests" [
        testCase "sound check - server is online" 
        <| fun () ->
            let browser = startBrowser()
            startApp browser
            browser.quit()

        testCase "login with test user" 
        <| fun () ->
            let browser = startBrowser()
            startApp browser
            login browser
            logout browser
            browser.quit()

        testCase "login go to profile"
        <| fun () ->
            let browser = startBrowser()
            startApp browser
            login browser
            browser.click "Profile"
            logout browser
            browser.quit()
    ]

I set the parallel flag to false and even then the tests don’t run with Instance method.

I have figured out what was wrong. I was using << instead of browser.write which was expecting the global browser and was failing on it.

Now I can get my tests to run but I still don’t see multiple instances of chromedriver.exe in my task manager which I think means the tests aren’t running in parallel, is this correct?

Glad you got them running! Is there a repo up that I can pull down and try as well?

I’ll try and create a sample to share it with you.

You can download the SAFE project and run the tests.

I have modified my Runner.fs as shown below

module UITests.Runner

open System.IO
open canopy
open canopy.classic
open canopy.runner.classic
open canopy.types
open Expecto
open System.Diagnostics
open System

[<EntryPoint>]
let main args =
    try
        try
            runTestsWithArgs { 
                defaultConfig with 
                    ``parallel`` = true
                    // ``parallelWorkers`` = 5
                    // ``stress`` = Some (TimeSpan.FromMinutes(1.))
             } args Tests.tests
        with e ->
            printfn "Error: %s" e.Message
            -1
    finally
        quit()