diff --git a/tests/Berufsschule_HAM.E2ETests/AssetsPageTests.cs b/tests/Berufsschule_HAM.E2ETests/AssetsPageTests.cs index 31c3454..096533a 100644 --- a/tests/Berufsschule_HAM.E2ETests/AssetsPageTests.cs +++ b/tests/Berufsschule_HAM.E2ETests/AssetsPageTests.cs @@ -42,7 +42,7 @@ public class AssetsPageTests : IDisposable css.ForEach(selector => _driver.FindElement(By.CssSelector(selector))); } - [Fact] + [RetryFact(5)] public void AssetsPage_ShouldCreateAndShowDetailAndUpdateAndDeleteAsset() { AppHelper.Login(_driver); diff --git a/tests/Berufsschule_HAM.E2ETests/GroupsPageTests.cs b/tests/Berufsschule_HAM.E2ETests/GroupsPageTests.cs index 4942c35..c93ce7b 100644 --- a/tests/Berufsschule_HAM.E2ETests/GroupsPageTests.cs +++ b/tests/Berufsschule_HAM.E2ETests/GroupsPageTests.cs @@ -40,7 +40,7 @@ public class GroupsPageTests : IDisposable css.ForEach(selector => _driver.FindElement(By.CssSelector(selector))); } - [Fact] + [RetryFact(5)] public void GroupsPage_ShouldCreateAndUpdateAndDeleteGroup() { string randomName = $"RESERVED_TEST_{AppHelper.GetRandomName()}"; diff --git a/tests/Berufsschule_HAM.E2ETests/InventoryPageTests.cs b/tests/Berufsschule_HAM.E2ETests/InventoryPageTests.cs index d82bc48..80503d4 100644 --- a/tests/Berufsschule_HAM.E2ETests/InventoryPageTests.cs +++ b/tests/Berufsschule_HAM.E2ETests/InventoryPageTests.cs @@ -33,7 +33,7 @@ public class InventoryPageTests : IDisposable _driver.FindElement(By.Id("scanBarcodeButton")); } - [Fact] + [RetryFact(5)] public void InventoryPage_ShouldShowCompleteViewModal() { AppHelper.Login(_driver); @@ -62,7 +62,7 @@ public class InventoryPageTests : IDisposable Assert.NotEmpty(_driver.FindElement(By.Id("detailPurchaseBy")).GetAttribute("value") ?? ""); } - [Fact] + [RetryFact(5)] public void InventoryPage_ShouldShowSuccessToastOnInformationCorrect() { AppHelper.Login(_driver); @@ -79,7 +79,7 @@ public class InventoryPageTests : IDisposable Assert.True(AppHelper.TryRetryFindSuccessToast(_driver)); } - [Fact] + [RetryFact(5)] public void InventoryPage_ShouldShowSuccessToastOnInformationUpdate() { AppHelper.Login(_driver); diff --git a/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs b/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs index 169ab3b..c334d47 100644 --- a/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs +++ b/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs @@ -40,7 +40,7 @@ public class LocationsPageTests : IDisposable css.ForEach(selector => _driver.FindElement(By.CssSelector(selector))); } - [Fact] + [RetryFact(5)] public void LocationsPage_ShouldCreateAndUpdateAndDeleteGroup() { string randomName = $"RESERVED_LOCATION_{AppHelper.GetRandomName()}"; diff --git a/tests/Berufsschule_HAM.E2ETests/RetryFactAttribute.cs b/tests/Berufsschule_HAM.E2ETests/RetryFactAttribute.cs new file mode 100644 index 0000000..893d919 --- /dev/null +++ b/tests/Berufsschule_HAM.E2ETests/RetryFactAttribute.cs @@ -0,0 +1,49 @@ +using System; +using Xunit; +using Xunit.Abstractions; +using Xunit.Sdk; + +namespace Berufsschule_HAM.E2ETests; + +[XunitTestCaseDiscoverer("YourNamespace.RetryFactDiscoverer", "YourAssemblyName")] +public class RetryFactAttribute(int maxRetries = 5) : FactAttribute +{ + public int MaxRetries { get; } = maxRetries; +} + +public class RetryTestCase : XunitTestCase +{ + private int _maxRetries; + + [Obsolete("Called by the de-serializer", true)] + public RetryTestCase() { } + + public RetryTestCase(int maxRetries, ITestMethod testMethod) + : base(new NullMessageSink(), TestMethodDisplay.Method, TestMethodDisplayOptions.None, testMethod) + { + _maxRetries = maxRetries; + } + + public override async Task RunAsync( + IMessageSink diagnosticMessageSink, + IMessageBus messageBus, + object[] constructorArguments, + ExceptionAggregator aggregator, + CancellationTokenSource cancellationTokenSource) + { + var summary = new RunSummary(); + + for (int i = 1; i <= _maxRetries; i++) + { + var result = await base.RunAsync( + diagnosticMessageSink, messageBus, constructorArguments, aggregator, cancellationTokenSource); + + summary.Aggregate(result); + + if (result.Failed == 0) + break; // success, stop retrying + } + + return summary; + } +} \ No newline at end of file diff --git a/tests/Berufsschule_HAM.E2ETests/UsersPageTests.cs b/tests/Berufsschule_HAM.E2ETests/UsersPageTests.cs index 91b01f9..859323b 100644 --- a/tests/Berufsschule_HAM.E2ETests/UsersPageTests.cs +++ b/tests/Berufsschule_HAM.E2ETests/UsersPageTests.cs @@ -42,7 +42,7 @@ public class UsersPageTests : IDisposable css.ForEach(selector => _driver.FindElement(By.CssSelector(selector))); } - [Fact] + [RetryFact(5)] public void UsersPage_ShouldCreateAndShowDetailAndUpdateAndDeleteUser() { AppHelper.Login(_driver);