Vous cherchez à obtenir de l'aide pour rendre mes tests parallélisables. J'ai une configuration Selenium c # qui utilise une combinaison de NUnit, C # et Selenium pour exécuter des tests en séquence localement sur ma machine ou sur le serveur CI.
J'ai déjà étudié la parallélisation des tests, mais je n'ai pas réussi à faire le saut, et courir dans une séquence était bien.
Au moment où j'ajoute la balise NUnit [Parallelizable], j'obtiens une erreur "OpenQA.Selenium.WebDriverException: ID de session invalide", en fonction de la lecture que j'ai faite, j'ai besoin de rendre chaque nouveau pilote que j'appelle unique. Cependant, je ne sais pas comment faire cela? ou même commencer d'ailleurs ... est-ce même possible dans ma configuration actuelle?
Mes tests font actuellement des tests de fumée limités et suppriment simplement les tests de régression répétitifs contre plusieurs navigateurs, cependant, je prévois un besoin d'élargir considérablement ma couverture de la capacité de test.
Je vais probablement chercher à obtenir Browserstack ou Sauselab à long terme, mais cela nécessite évidemment un financement, et je dois le faire approuver, donc je chercherai à le faire fonctionner localement pour l'instant.
voici un aperçu de la configuration de base de mon code
fichiers de test:
1er fichier de test .cs
{
[TestFixture]
[Parallelizable]
public class Featur2Tests1 : TestBase
{
[Test]
[TestCaseSource(typeof(TestBase), "TestData")]
public void test1(string BrowserName, string Environment, string System)
{
Setup(BrowserName, Environment, System);
//Run test steps....
}
[Test]
[TestCaseSource(typeof(TestBase), "TestData")]
public void test2(string BrowserName, string Environment, string System)
{
Setup(BrowserName, Environment, System);
//Run test steps....
}
}
}
2ème fichier de test .cs
{
[TestFixture]
[Parallelizable]
public class FeatureTests2 : TestBase
{
[Test]
[TestCaseSource(typeof(TestBase), "TestData")]
public void test1(string BrowserName, string Environment, string System)
{
Setup(BrowserName, Environment, System);
//Run test steps....
}
[Test]
[TestCaseSource(typeof(TestBase), "TestData")]
public void test2(string BrowserName, string Environment, string System)
{
Setup(BrowserName, Environment, System);
//Run test steps....
}
}
}
TestBase.cs où ma configuration pour chaque test
{
public class TestBase
{
public static IWebDriver driver;
public void Setup(string BrowserName, string Environment, string System)
{
Driver.Intialize(BrowserName);
//do additional setup before test run...
}
[TearDown]
public void CleanUp()
{
Driver.Close();
}
public static IEnumerable TestData
{
get
{
string[] browsers = Config.theBrowserList.Split(',');
string[] Environments = Config.theEnvironmentList.Split(',');
string[] Systems = Config.theSystemList.Split(',');
foreach (string browser in browsers)
{
foreach (string Environment in Environments)
{
foreach (string System in Systems)
{
yield return new TestCaseData(browser, Environment, System);
}
}
}
}
}
}
}
Le IEnumerable TestData provient d'un fichier appelé config.resx et contient les données suivantes:
C'est là que je crée mon pilote dans Driver.cs
{
public class Driver
{
public static IWebDriver Instance { get; set; }
public static void Intialize(string browser)
{
string appDirectory = Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.Parent.FullName;
string driverFolder = $"{appDirectory}/Framework.Platform/bin/debug";
if (browser == "Chrome")
{
ChromeOptions chromeOpts = new ChromeOptions();
chromeOpts.AddUserProfilePreference("safebrowsing.enabled", true);
chromeOpts.AddArgument("start-maximized");
chromeOpts.AddArgument("log-level=3");
Instance = new ChromeDriver(driverFolder, chromeOpts);
}
else if (browser == "IE")
{
var options = new InternetExplorerOptions { EnsureCleanSession = true };
options.AddAdditionalCapability("IgnoreZoomLevel", true);
Instance = new InternetExplorerDriver(driverFolder, options);
Instance.Manage().Window.Maximize();
}
else if (browser == "Edge")
{
EdgeOptions edgeOpts = new EdgeOptions();
Instance = new EdgeDriver(driverFolder, edgeOpts);
Instance.Manage().Window.Maximize();
Instance.Manage().Cookies.DeleteAllCookies();
}
else if (browser == "Firefox")
{
FirefoxOptions firefoxOpts = new FirefoxOptions();
Instance = new FirefoxDriver(driverFolder, firefoxOpts);
Instance.Manage().Window.Maximize();
}
else { Assert.Fail($"Browser Driver; {browser}, is not currently supported by Initialise method"); }
}
public static void Close(string browser = "other")
{
if (browser == "IE")
{
Process[] ies = Process.GetProcessesByName("iexplore");
foreach (Process ie in ies)
{
ie.Kill();
}
}
else
{
Instance.Quit();
}
}
}
}
Tous vos tests utilisent le même pilote, qui est défini dans TestBase comme statique. Les deux appareils fonctionneront en parallèle et affecteront tous deux l'état du pilote. Si vous souhaitez que deux tests s'exécutent en parallèle, ils ne peuvent pas tous deux utiliser le même état, à l'exception des valeurs constantes ou en lecture seule.
La première chose à faire serait de faire du pilote un membre d'instance, afin que chacun des appareils dérivés fonctionne avec un pilote différent. Si cela ne résout pas le problème, cela vous mènera au moins à l'étape suivante vers une solution.
n'utilisez pas d'électricité statique et cela devrait aider à résoudre votre problème
public IWebDriver Instance { get; set; }
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
namespace Nunit_ParalelizeTest
{
public class Base
{
protected IWebDriver _driver;
[TearDown]
public void TearDown()
{
_driver.Close();
_driver.Quit();
}
[SetUp]
public void Setup()
{
_driver = new ChromeDriver();
_driver.Manage().Window.Maximize();
}
}
}
Je vois qu'il n'y a pas de [Setup]
Au-dessus de la méthode de configuration dans la TestBase. Une session non valide est due au fait que vous essayez de fermer une fenêtre qui n'est pas là. Essayez également de remplacer driver.close()
par driver.quit();