我正致力于改进我的自动化功能测试以并行运行以减少测试套件的运行时间。我遇到的问题是了解如何在测试并行运行时管理我的测试数据。如何在并行运行测试时管理测试数据
更具体地说,当测试连续运行时,我使用单个用户登录到应用程序没有问题。但是,当试图使用该用户运行多个测试并尝试登录时,这不起作用。我有其他用户可以用来登录。我的问题是如何管理这些用户,以便1次测试使用1个唯一用户?除非他有空,否则没有其他测试会触动该用户。
如果你可以提供一些伪代码或代码示例,它确实会有所帮助。
感谢提前:)
从@grafito反馈之后,这是我想出了一个解决方案。似乎正在全力工作。当所有用户都连接时,我们会陷入循环,直到有一个可用。
namespace UnitTestProject1
{
[TestFixture]
[Parallelizable]
[Category("ParallelTest2")]
public class ParallelTestingExampleV2_A : BaseTest
{
[Test]
public void TestMethod1()
{
Trace.WriteLine($"Test1 has user {AvailableUser.UserName}");
Thread.Sleep(50000);
Trace.WriteLine($"Test1 sleeping for 50000ms so one user is Connected.");
}
}
[TestFixture]
[Parallelizable]
[Category("ParallelTest2")]
public class ParallelTestingExampleV2_B : BaseTest
{
[Test]
public void TestMethod2()
{
Trace.WriteLine($"Test2 has user {AvailableUser.UserName}");
}
}
[TestFixture]
[Parallelizable]
[Category("ParallelTest2")]
public class ParallelTestingExampleV2_C : BaseTest
{
[Test]
public void TestMethod3()
{
Trace.WriteLine($"Test3 has user {AvailableUser.UserName}");
}
}
[SetUpFixture]
public class TestFixtureForTestsNamespace
{
public static ListOfUsers ListOfAllPossibleUsers;
[OneTimeSetUp]
public void RunBeforeAllTestsAreExecutedInSomeNamespace()
{
GetPoolOfUsers();
}
private static void GetPoolOfUsers()
{
var oneUser = new User
{
UserName = "a",
Password = "a"
};
var secondUser = new User
{
UserName = "b",
Password = "b"
};
ListOfAllPossibleUsers = new ListOfUsers() { oneUser, secondUser };
}
}
public class BaseTest
{
protected User AvailableUser;
[SetUp]
public void SetupForEveryTestMethod()
{
AvailableUser = TestFixtureForTestsNamespace.ListOfAllPossibleUsers.GetAvailableUser();
}
[TearDown]
public void TearDownForEveryTestMethod()
{
TestFixtureForTestsNamespace.ListOfAllPossibleUsers.ReleaseUser(AvailableUser);
}
}
public class User
{
internal string UserName = "";
internal string Password = "";
internal bool Connected;
}
public class ListOfUsers : List<User>
{
internal void ReleaseUser(User userToBeReleased)
{
lock (this) { userToBeReleased.Connected = false; }
}
internal User GetAvailableUser()
{
User user = null;
while (user == null)
{
lock (this)
{
for (int i = 0; i < Count && user == null; i++)
{
if (!this[i].Connected)
user = this[i];
}
if (user != null)
user.Connected = true;
}
Thread.Sleep(200);
}
return user;
}
}
}
您所标记的单元测试,但似乎是描述集成测试。两者的策略不一定相同。 – Kritner