Parallel Testing is a BrowserStack feature that allows you to run same test or different tests simultaneously across different device and OS version combinations. It will help you to reduce the run time of your test suite, resulting in faster build times and releases.
For example, execution time of a test suite which takes 30 minutes running sequentially can be brought down to as low as 3 minutes by running 10 parallel tests (with the assumption that all your test cases take approximately the same time).
In this guide, you will learn how to :
username
and access_key
. If you haven’t created an account yet, sign up for a free trial or purchase a paid plan. After signup, you can obtain your access credentials here.apk
or .aab
file) or iOS app (.ipa
file).apk
or .ipa
file and are looking to simply try App Automate, you can download and test using our sample Android app or sample iOS app.
Upload your Android app (.apk
or .aab
file) or iOS app (.ipa
file) to BrowserStack servers using our REST API. Here is an example cURL
request to upload app on App Automate :
curl -u "YOUR_USERNAME:YOUR_ACCESS_KEY" \
-X POST "https://api-cloud.browserstack.com/app-automate/upload" \
-F "file=@/path/to/apk/file"
curl -u "YOUR_USERNAME:YOUR_ACCESS_KEY" ^
-X POST "https://api-cloud.browserstack.com/app-automate/upload" ^
-F "file=@/path/to/apk/file"
Ensure that @
symbol is prepended to the file path in the above request. A sample response for the above request is shown below:
{
"app_url" : "bs://j3c874f21852ba57957a3fdc33f47514288c4ba4"
}
Please note the app_url
value returned in the API response (bs://j3c874.....
in the above example). We will use this value to set the application under test while configuring the test later on.
cURL
command until you get the response back.Clone the NUnit sample integration code from our GitHub repository.
git clone https://github.com/browserstack/nunit-appium-app-browserstack.git
Next, switch to appium_dotnet_driver_4_examples
under android
or ios
directory and open the android.sln
or ios.sln
file in Visual Studio.
appium_dotnet_driver_3_examples
directory in the NUnit sample integration code repository and follow the steps outlined here.
To install the required NuGet packages, build the project. This will install requisite dependencies including Appium’s dotnet driver :
<packages>
<package id="Appium.WebDriver" version="4.2.1" targetFramework="net461" />
<package id="BrowserStackLocal" version="1.4.0" targetFramework="net461" />
<package id="Castle.Core" version="4.4.1" targetFramework="net461" />
<package id="DotNetSeleniumExtras.PageObjects" version="3.11.0" targetFramework="net461" />
<package id="DotNetSeleniumExtras.WaitHelpers" version="3.11.0" targetFramework="net461" />
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net461" />
<package id="NUnit" version="3.12.0" targetFramework="net461" />
<package id="NUnit3TestAdapter" version="3.17.0" targetFramework="net461" />
<package id="Selenium.Support" version="3.141.0" targetFramework="net461" />
<package id="Selenium.WebDriver" version="3.141.0" targetFramework="net461" />
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net461" />
</packages>
Desired capabilities are a series of key-value pairs that allow you to configure your Appium tests on BrowserStack. The following capabilities are required :
app
capability : Its used to specify your uploaded app that will be installed on device during test execution. Use the app_url
obtained in Upload your App section to set its value.device
capability : Its used to specify the BrowserStack device you want to run the test on.In the NUnit sample integration code, Appium’s desired capabilities are defined in the Appium.config
file located in the appium_dotnet_driver_4_examples/
directory. Note the multiple devices listed in environments
key to specify the list of devices for parallel test execution.
<configuration>
<!-- Provide BrowserStack username and access_key -->
<appSettings>
<add key="user" value="<YOUR_USERNAME>"/>
<add key="key" value="<YOUR_ACCESS_KEY>"/>
<add key="server" value="hub.browserstack.com"/>
</appSettings>
<capabilities>
<parallel>
<add key="app" value="bs://<app_id>"/>
<add key="project" value="NUnit Android"/>
<add key="build" value="Parallel NUnit Android Test"/>
<add key="name" value="parallel_test"/>
<add key="browserstack.debug" value="true"/>
</parallel>
</capabilities>
<!-- Devices on which test will run -->
<environments>
<pixel-3>
<add key="device" value="Google Pixel 3"/>
<add key="os_version" value="9.0"/>
</pixel-3>
<galaxy-s10e>
<add key="device" value="Samsung Galaxy S10e"/>
<add key="os_version" value="9.0"/>
</galaxy-s10e>
</environments>
</configuration>
<configuration>
<!-- Provide BrowserStack username and access_key -->
<appSettings>
<add key="user" value="<YOUR_USERNAME>"/>
<add key="key" value="<YOUR_ACCESS_KEY>"/>
<add key="server" value="hub.browserstack.com"/>
</appSettings>
<capabilities>
<parallel>
<add key="app" value="bs://<app_id>"/>
<add key="project" value="NUnit Android"/>
<add key="build" value="Parallel NUnit Android Test"/>
<add key="name" value="parallel_test"/>
<add key="browserstack.debug" value="true"/>
</parallel>
</capabilities>
<!-- Devices on which test will run -->
<environments>
<iphone-11-pro>
<add key="device" value="iPhone 11 Pro"/>
<add key="os_version" value="13.0"/>
</iphone-11-pro>
<iphone-11-pro-max>
<add key="device" value="iPhone 11 Pro Max"/>
<add key="os_version" value="13.0"/>
</iphone-11-pro-max>
</environments>
</configuration>
Once you have configured desired capabilities, you can initialize an Appium webdriver to test remotely on BrowserStack. In order to do so, you need to use a remote BrowserStack URL along with your BrowserStack access credentials.
In the NUnit sample integration code, the remote Webdriver is initialised in the BrowserStackNUnitTest.cs
file located in the appium_dotnet_driver_4_examples/parallel-test
directory as shown below :
namespace android.first
{
public class BrowserStackNUnitTest
{
//...
protected AndroidDriver<AndroidElement> driver;
[SetUp]
public void Init()
{
//...
Uri uri = new Uri("http://" + ConfigurationManager.AppSettings.Get("server") + "/wd/hub/");
driver = new AndroidDriver<AndroidElement>(uri, options);
}
//...
}
}
namespace ios.first
{
public class BrowserStackNUnitTest
{
//...
protected IOSDriver<IOSElement> driver;
[SetUp]
public void Init()
{
//...
Uri uri = new Uri("http://" + ConfigurationManager.AppSettings.Get("server") + "/wd/hub/");
driver = new IOSDriver<IOSElement>(uri, options);
}
//...
}
}
BROWSERSTACK_USERNAME
& BROWSERSTACK_ACCESS_KEY
environment variables or byuser
& key
parameters in Appium.config
file located in appium_dotnet_driver_4_examples/
directory
This step will help you setup a test case with JUnit framework that will execute in parallel on multiple devices. In the NUnit sample integration code, we have provided a sample test-case in appium_dotnet_driver_4_examples/parallel-test
directory for BrowserStack’s sample apps. If you are testing your own app, please modify the test case accordingly.
If you are using your own app, modify the following code as per your test case :
using System;
using System.Threading;
using System.Collections.ObjectModel;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.Android;
using OpenQA.Selenium.Support.UI;
namespace android.parallel
{
[TestFixture("parallel", "pixel-3")]
[TestFixture("parallel", "galaxy-s10e")]
[Parallelizable(ParallelScope.Fixtures)]
public class ParallelTest : BrowserStackNUnitTest
{
public ParallelTest(string profile, string device) : base(profile,device){ }
[Test]
public void searchWikipedia()
{
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
AndroidElement searchElement = (AndroidElement) wait.Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(
MobileBy.AccessibilityId("Search Wikipedia")));
searchElement.Click();
AndroidElement insertTextElement = (AndroidElement) wait.Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(
By.Id("org.wikipedia.alpha:id/search_src_text")));
insertTextElement.SendKeys("Browserstack");
Thread.Sleep(5000);
ReadOnlyCollection<AndroidElement> allProductsName = driver.FindElements(
By.ClassName("android.widget.TextView"));
Assert.True(allProductsName.Count > 0);
}
}
}
using System;
using NUnit.Framework;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.iOS;
using OpenQA.Selenium.Support.UI;
namespace ios.parallel
{
[TestFixture("parallel", "iphone-11-pro")]
[TestFixture("parallel", "iphone-11-pro-max")]
[Parallelizable(ParallelScope.Fixtures)]
public class ParallelTest : BrowserStackNUnitTest
{
public ParallelTest(string profile, string device) : base(profile, device) {}
[Test]
public void textVerificationTest()
{
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
IOSElement textButton = (IOSElement) wait.Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(
MobileBy.AccessibilityId("Text Button")));
textButton.Click();
IOSElement textInput = (IOSElement) wait.Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(
MobileBy.AccessibilityId("Text Input")));
textInput.SendKeys("hello@browserstack.com"+"\n");
IOSElement textOutput = (IOSElement) wait.Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(
MobileBy.AccessibilityId("Text Output")));
Assert.AreEqual(textOutput.Text,"hello@browserstack.com");
}
}
}
Run parallel tests using following steps :
Build android
or Build ios
under Build menuTest Explorer
under Test menu or on Mac, select Unit Tests
under View > Pads menu itemandroid.parallel
or ios.parallel
test and click run
You can access the test execution results, and debugging information such as video recording, network and device logs on App Automate dashboard or using our REST APIs.
If you have any queries, please get in touch with us.
Contact our Support team for immediate help while we work on improving our docs.
Contact our Support team for immediate help while we work on improving our docs.
Thank you for your valuable feedback!