azure-devopsvstestvstest.console.exevisual-studio-test-runnervstest.console

VSTS Test fails but vstest.console passes; the assert executes before the code for some reason?


Well the system we have has a bunch of dependencies, but I'll try to summarize what's going on without divulging too much details.

Test assembly in the form of a .dll is the one being executed. A lot of these tests call an API.

In the problematic method, there's 2 API calls that have an await on them: one to write a record to that external interface, and another to extract all records and then read the last one in that external interface, both via API. The test is simply to check if writing the last record was successful in an end-to-end context, that's why there's both a write and then a read.

If we execute the test in Visual Studio, everything works as expected. I also tested it manually via command lining vstest.console.exe, and the expected results always come out as well.

However, when it comes to VS Test task in VSTS, it fails for some reason. We've been trying to figure it out, and eventually we reached the point where we printed the list from the 'read' part. It turns out the last record we inserted isn't in the data we pulled, but if we check the external interface via a different method, we confirmed that the write process actually happened. What gives? Why is VSTest getting like an outdated set of records?

We also noticed two things:

1.) For the tests that passed, none of the Console.WriteLine outputs appear in the logs. Only on Failed test do they do so.

2.) Even if our Data.Should.Be call is at the very end of the TestMethod, the logs report the fail BEFORE it prints out the lines! And even then, the printing should happen after reading the list of records, and yet when the prints do happen we're still missing the record we just wrote.

Is there like a bottom-to-top thing we're missing here? It really seems to me like VSTS vstest is executing the assert before the actual code. The order of TestMethods happen the right order though (the 4th test written top-to-bottom in the code is executed 4th rather than 4th to last) and we need them to happen in the right order because some of the later tests depend on the former tests succeeding.

Anything we're missing here? I'd put a source code but there's a bunch of things I need to scrub first if so.


Solution

  • Turns out we were sorely misunderstanding what 'await' does. We're using .Wait() instead for the culprit and will also go back through the other tests to check for quality.