Проблемы синхронизации при тестировании одновременного выполнения двух операций WCF в VS TestRunner
В настоящее время я пытаюсь получить преимущество WCF. Чтобы проверить одновременное выполнение двух операций, при использовании этого ServiceBehavior
раздел:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.Single,
AddressFilterMode = AddressFilterMode.Prefix)]
Я придумал следующее XUnit
тестовое задание:
[Fact]
public void LongRunningMethod_Two_Calls_To_LongRunningMethod_Execute_And_Return_Concurrently() // This is achieved by setting in Service.cs: ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)
{
var timeout1 = 3000;
var timeout2 = 1;
var sw1 = new Stopwatch();
var sw2 = new Stopwatch();
var task1 = Task.Run(() =>
{
sw1.Start();
client.LongRunningMethod(timeout1, "Call 1 to client.LongRunningMethod(...) finished.");
sw1.Stop();
});
var task2 = Task.Run(() =>
{
sw2.Start();
client.LongRunningMethod(timeout2, "Call 2 to client.LongRunningMethod(...) finished.");
sw2.Stop();
});
Task.WaitAll(new Task[] { task1, task2 });
Assert.True(sw2.ElapsedMilliseconds < sw1.ElapsedMilliseconds);
}
С выдержкой (с конструктором и деструктором) класса test:
public class ImplemenationExplorationTesting : IDisposable
{
private Service service;
private Server server;
private Client client;
private string constructorArgumentString = "A fixed ctor test value that the service should return.";
public ImplemenationExplorationTesting()
{
service = new Service(constructorArgumentString);
server = new Server(service);
server.Open();
client = new Client();
client.OpenConnection(server.Uri);
}
public void Dispose()
{
client.CloseConnection();
server.Close();
}
[Fact]
public void PingName_SendAndReceiveSimpleMessage_Works()
{
var expected = "UserName";
var actual = client.PingName(expected);
Assert.Equal(expected, actual);
}
[Fact]
public void StringPassedToTheServiceConstructorIsCorrectlyReturnedByServer()
{
var expected = constructorArgumentString;
var actual = client.GetDefaultString();
Assert.Equal(expected, actual);
}
}
Это работает, как и ожидалось, при запуске теста по отдельности. Однако, когда я запускаю несколько тестов одновременно, у меня возникают проблемы с синхронизацией, и тест не проходит. Судя по всему, тесты не запускаются одновременно и не прерываются, а кажутся "отрезанными по времени", что в конечном итоге вызывает эти проблемы. Итак, вопрос:
Можно ли ожидать такого поведения и как его избежать?