Saucery 4.5.14
Prefix Reserveddotnet add package Saucery --version 4.5.14
NuGet\Install-Package Saucery -Version 4.5.14
<PackageReference Include="Saucery" Version="4.5.14" />
paket add Saucery --version 4.5.14
#r "nuget: Saucery, 4.5.14"
// Install Saucery as a Cake Addin #addin nuget:?package=Saucery&version=4.5.14 // Install Saucery as a Cake Tool #tool nuget:?package=Saucery&version=4.5.14
Saucery
Saucery handles all the plumbing required to integrate with SauceLabs, making writing NUnit tests a breeze, so you only need to tell Saucery what you want. Saucery takes care of the how.
Note: The tests specified below are provided as examples only. Your tests, of course, will be specific to your System Under Test.
Initial Setup
- You'll need a SauceLabs account. You can get a free trial account here.
- If you want to run your tests locally you need to set 2 environment variables, SAUCE_USER_NAME and SAUCE_API_KEY
- To run your test suite from your GitHub Actions pipeline you need to set two secrets SAUCE_USER_NAME and SAUCE_API_KEY. Instructions on how to set Github Secrets are here.
Writing NUnit Tests
- In your solution create a simple class library.
- Add properties CopyLocalLockFileAssemblies and GenerateRuntimeConfigurationFiles to the top PropertyGroup of the project file and set them both to true.
- Add a NuGet Reference to Saucery and NUnit3TestAdapter.
Your Project file should look something like this:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
<PackageReference Include="Saucery" Version="4.5.7" />
</ItemGroup>
</Project>
The ExternalMerlin.NUnit dogfood integration tests use the following template:
using ExternalMerlin.XUnit.PageObjects;
using NUnit.Framework;
using Saucery;
using Saucery.Core.Dojo;
using Shouldly;
[assembly: LevelOfParallelism(4)]
namespace ExternalMerlin.NUnit;
[TestFixture]
[Parallelizable]
[TestFixtureSource(typeof(RequestedPlatformData))]
public class NuGetIntegrationTests(BrowserVersion browserVersion) : SauceryBase(browserVersion)
{
[Test]
[TestCase(5)]
[TestCase(4)]
public void DataDrivenTest(int data) {
var guineaPigPage = new GuineaPigPage(SauceryDriver(), "https://saucelabs.com/");
guineaPigPage.TypeField(SauceryDriver(), "comments", data.ToString());
Driver?.Title.ShouldContain("I am a page title - Sauce Labs");
}
[Test]
public void ClickLinkTest() {
var guineaPigPage = new GuineaPigPage(SauceryDriver(), "https://saucelabs.com/");
// find and click the link on the page
guineaPigPage.ClickLink(SauceryDriver());
// verify the browser was navigated to the correct page
Driver?.Url.ShouldContain("saucelabs.com/test-guinea-pig2.html");
}
}
The above code will run 3 unit tests (1 ClickLink test and 2 DataDrivenTitle tests) on all the platforms you specify, in parallel.
Parallelism
- The Level of Parallelism is determined by the number of parallel threads you have paid for in your SauceLabs account.
- We recommend 1 less than your limit. Our OpenSauce account has 5 so we specify 4 in our internal testing.
- Parallism is optional so you can exclude the
[assembly: LevelOfParallelism(4)]
and[Parallelizable]
lines if you wish.
The other lines are mandatory. Let's break the key lines down.
[TestFixture]
[Parallelizable]
[TestFixtureSource(typeof(RequestedPlatformData))]
public class NuGetIntegrationTests(BrowserVersion browserVersion) : SauceryBase(browserVersion)
You can call the class what you like but it must take a BrowserVersion
as a parameter and subclass SauceryBase
.
[TestFixtureSource(typeof(RequestedPlatformData))]
is how you tell Saucery what platforms you want to test on. You need to specify a class to do that. In this example its called RequestedPlatformData
but you can call it anything you like.
Let's look at what it should contain.
using Saucery.Core.DataSources;
using Saucery.Core.OnDemand;
using Saucery.Core.OnDemand.Base;
using Saucery.Core.Util;
namespace ExternalMerlin.NUnit;
public class RequestedPlatformData : SauceryTestData
{
static RequestedPlatformData()
{
List<SaucePlatform> platforms =
[
//Real Devices
new AndroidRealDevice("Google Pixel 8 Pro", "14"),
new IOSRealDevice("iPhone 14 Pro Max", "16"),
//Emulated Mobile Platforms
new AndroidPlatform("Google Pixel 8 Pro GoogleAPI Emulator", "14.0", SauceryConstants.DEVICE_ORIENTATION_PORTRAIT),
new IOSPlatform("iPhone 14 Pro Max Simulator", "16.2", SauceryConstants.DEVICE_ORIENTATION_LANDSCAPE),
//Desktop Platforms
new DesktopPlatform(SauceryConstants.PLATFORM_LINUX, SauceryConstants.BROWSER_CHROME, SauceryConstants.BROWSER_VERSION_LATEST),
new DesktopPlatform(SauceryConstants.PLATFORM_WINDOWS_11, SauceryConstants.BROWSER_CHROME, "75"),
new DesktopPlatform(SauceryConstants.PLATFORM_WINDOWS_10, SauceryConstants.BROWSER_CHROME, "76", SauceryConstants.SCREENRES_2560_1600)
];
SetPlatforms(platforms, PlatformFilter.Emulated);
}
}
The List<SaucePlatform>
is what you will specify. The rest of the class is mandatory. Check out SauceryConstants
for all the platform, browser and screenres enums.
Platform Range Expansion
Platform range expansion is a feature unique to Saucery. Say you wanted to test on a range of browser versions but you didn't want to specify each individually. That's fine. Saucery supports specifying ranges.
new DesktopPlatform(SauceryConstants.PLATFORM_WINDOWS_11, SauceryConstants.BROWSER_CHROME, "100->119")
This will test on Windows 11 Chrome all available versions from 100 to 119 inclusive.
Real Devices
Yes, Saucery supports Real Devices!
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. |
-
net9.0
- Microsoft.NET.Test.Sdk (>= 17.12.0)
- NUnit (>= 4.3.2)
- NUnit3TestAdapter (>= 4.6.0)
- Saucery.Core (>= 4.5.14)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
4.5.14 | 0 | 1/27/2025 |
4.5.13 | 355 | 1/21/2025 |
4.5.12 | 136 | 1/21/2025 |
4.5.11 | 198 | 1/19/2025 |
4.5.10 | 272 | 1/17/2025 |
4.5.9 | 180 | 1/12/2025 |
4.5.8 | 505 | 12/28/2024 |
4.5.7 | 634 | 12/9/2024 |
4.5.6 | 742 | 9/26/2024 |
4.5.5 | 256 | 9/13/2024 |
4.5.4 | 376 | 8/1/2024 |
4.5.3 | 408 | 7/12/2024 |
4.5.2 | 167 | 7/10/2024 |
4.5.1 | 384 | 6/29/2024 |
4.5.0 | 189 | 6/25/2024 |
4.4.6 | 180 | 6/24/2024 |
4.4.5 | 187 | 6/23/2024 |
4.4.4 | 263 | 5/26/2024 |
4.4.3 | 606 | 12/16/2023 |
4.4.2 | 201 | 12/11/2023 |
4.4.1 | 92 | 12/11/2023 |
4.4.0 | 280 | 12/8/2023 |
4.3.0 | 227 | 11/18/2023 |
4.2.0 | 359 | 8/5/2023 |
4.1.1 | 415 | 3/25/2023 |
4.0.3 | 494 | 6/13/2022 |
ChangeLog:
v4.1.1
- Initial Release with dependency on Saucery.Core