This note outlines the JSON protcol between an Editor/IDE and the test platform. It is an addendum to Discovery Protocol and Execution Protocol documents.
- Editor is an application which wants to discover, run tests from a test assembly. It has intimate knowledge of the test project.
- Test Platform is the runner and engine which knows how to discover/run tests.
- Request is a message from the Editor to Test Platform.
- Response is a message from the Test Platform to Editor.
Microsoft.TestPlatform.TranslationLayer
provides a .net implementation of this
API. TODO: Link to sdk doc.
Editor should launch the test platform with its process id and a port that test platform can connect to. It will start console runner as follows:
> dotnet vstest --ParentProcessId <pid> --Port <port>
The windows only console runner vstest.console.exe
also supports the same
parameters. The test platform tries to connect to <port>
and sends a
connection
message.
All the communication messages between an Editor and Test Platform have following structure:
Key | Type | Description |
---|---|---|
MessageType | string | Type of message |
Payload | object | Payload for an operation input or output. Can be null. |
{
"MessageType": "TestSession.Connected",
"Payload": null
}
The Payload
provides data specific to an request or response. It may be null
for connection
and version
messsages.
The test platform sends a connection message after launch.
Key | Type | Description |
---|---|---|
MessageType | string | TestSession.Connected |
Payload | object | null |
{
"MessageType": "TestSession.Connected",
"Payload": null
}
An Editor can use the version operation to check the protocol version supported by the available test platform. It may modify the protocol for further communication if needed.
A version request from Editor to Test Platform has following structure.
Key | Type | Description |
---|---|---|
MessageType | string | ProtocolVersion |
Payload | object | null |
{
"MessageType": "ProtocolVersion",
"Payload": null
}
A version response from Test Platform has following structure.
Key | Type | Description |
---|---|---|
MessageType | string | ProtocolVersion |
Payload | object | 1 |
{
"MessageType": "ProtocolVersion",
"Payload": null
}
At this point the initial handshake between Editor and Test Platform is complete. Above operation is required only once per launch of test platform. Subsequent discovery, execution operation don't require an initialization.
This request ensures that all the extensions that are required for discovery or execution get loaded before the actual operation request. While running test targeting .net4x framework, this is required for initializing the test adapters.
Key | Type | Description |
---|---|---|
MessageType | string | Extensions.Initialize |
Payload | array | List of paths of extensions |
{
"MessageType": "Extensions.Initialize",
"Payload": [
"E:\\UnitTest1\\UnitTest1\\bin\\Debug\\net452\\Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.dll"
]
}
A discovery operation requests the test platform to load the test container, use the appropriate test adapter and list all tests available within the container.
Various Message
types supported during discovery operation are:
- TestDiscovery.Start
- TestDiscovery.TestFound
- TestDiscovery.Completed
An Editor triggers the discovery operation with a TestDiscovery.Start
message.
Key | Type | Description |
---|---|---|
MessageType | string | TestDiscovery.Start |
Payload | object | See below |
Key | Type | Description |
---|---|---|
Sources | array | Array of test container paths. |
RunSettings | string | Run settings xml |
{
"MessageType": "TestDiscovery.Start",
"Payload": {
"Sources": [
".\\samples\\UnitTestProject\\bin\\Debug\\netcoreapp1.0\\UnitTestProject.dll"
],
"RunSettings": null
}
}
Refer msdn for run settings sample.
The test platform sends tests found messages for the tests discovered. There can
be one or many such messages. Editor is expected to listen to such messages
until a TestDiscovery.Completed
message is received.
Key | Type | Description |
---|---|---|
MessageType | string | TestDiscovery.TestFound |
Payload | array | See below for details of Property |
For TestDiscovery.TestFound
message, the Payload is an array of TestCase
objects. See appendix for details.
{
"MessageType": "TestDiscovery.TestFound",
"Payload": [
{
"Properties": [
{
"Key": {
"Id": "TestCase.FullyQualifiedName",
"Label": "FullyQualifiedName",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": "UnitTestProject.UnitTest.PassingTest"
},
{
"Key": {
"Id": "TestCase.ExecutorUri",
"Label": "Executor Uri",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Uri"
},
"Value": "executor://MSTestAdapter/v2"
},
{
"Key": {
"Id": "TestCase.Source",
"Label": "Source",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": ".\\samples\\UnitTestProject\\bin\\Debug\\netcoreapp1.0\\UnitTestProject.dll"
},
{
"Key": {
"Id": "TestCase.DisplayName",
"Label": "Name",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "PassingTest"
},
{
"Key": {
"Id": "MSTestDiscovererv2.IsEnabled",
"Label": "IsEnabled",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Boolean"
},
"Value": true
},
{
"Key": {
"Id": "MSTestDiscovererv2.TestClassName",
"Label": "ClassName",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": "UnitTestProject.UnitTest"
},
{
"Key": {
"Id": "TestObject.Traits",
"Label": "Traits",
"Category": "",
"Description": "",
"Attributes": 5,
"ValueType": "System.Collections.Generic.KeyValuePair`2[[System.String],[System.String]][]"
},
"Value": []
}
]
},
{
"Properties": [
{
"Key": {
"Id": "TestCase.FullyQualifiedName",
"Label": "FullyQualifiedName",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": "UnitTestProject.UnitTest.TestWithPriority"
},
{
"Key": {
"Id": "TestCase.ExecutorUri",
"Label": "Executor Uri",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Uri"
},
"Value": "executor://MSTestAdapter/v2"
},
{
"Key": {
"Id": "TestCase.Source",
"Label": "Source",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": ".\\samples\\UnitTestProject\\bin\\Debug\\netcoreapp1.0\\UnitTestProject.dll"
},
{
"Key": {
"Id": "TestCase.DisplayName",
"Label": "Name",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "TestWithPriority"
},
{
"Key": {
"Id": "MSTestDiscovererv2.IsEnabled",
"Label": "IsEnabled",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Boolean"
},
"Value": true
},
{
"Key": {
"Id": "MSTestDiscovererv2.TestClassName",
"Label": "ClassName",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": "UnitTestProject.UnitTest"
},
{
"Key": {
"Id": "MSTestDiscovererv2.Priority",
"Label": "Priority",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Int32"
},
"Value": 0
},
{
"Key": {
"Id": "TestObject.Traits",
"Label": "Traits",
"Category": "",
"Description": "",
"Attributes": 5,
"ValueType": "System.Collections.Generic.KeyValuePair`2[[System.String],[System.String]][]"
},
"Value": [
{
"Key": "Priority",
"Value": "0"
}
]
}
]
}
]
}
A discovery complete message from Test Platform marks the end of discovery process.
Key | Type | Description |
---|---|---|
MessageType | string | TestDiscovery.Completed |
Payload | object | See below for details |
Payload for TestDiscovery.Completed
has following structure.
Key | Type | Description |
---|---|---|
TotalTests | number | Number of tests discovered |
LastDiscoveredTests | array | Set of TestCase objects in the final chunk |
IsAborted | boolean | true indicates an aborted discovery operation |
{
"MessageType": "TestDiscovery.Completed",
"Payload": {
"TotalTests": 7,
"LastDiscoveredTests": null,
"IsAborted": false
}
}
A run tests request will trigger test execution for a given test container.
Key | Type | Description |
---|---|---|
MessageType | string | TestExecution.RunAllWithDefaultHost |
Payload | object | See below for details |
Payload for TestExecution.RunAllWithDefaultHost
has following structure.
Key | Type | Description |
---|---|---|
Sources | array | Set of test containers |
TestCases | array | Set of TestCase objects |
RunSettings | string | Run settings for the test run |
KeepAlive | boolean | Reserved for future |
DebuggingEnabled | boolean | true indicates a test run under debugger |
{
"MessageType": "TestExecution.RunAllWithDefaultHost",
"Payload": {
"Sources": [
".\\samples\\UnitTestProject\\bin\\Debug\\netcoreapp1.0\\UnitTestProject.dll"
],
"TestCases": null,
"RunSettings": null,
"KeepAlive": false,
"DebuggingEnabled": false
}
}
TargetFramework for the tests can be set using the runsettings. See appendix for details.
Test results are provided by test platform in batches. An editor should continue
to listen to TestExecution.StatsChange
messages until a
TestExecution.Completed
message is received.
Key | Type | Description |
---|---|---|
MessageType | string | TestExecution.StatsChange |
Payload | object | See details below |
Payload object has following structure.
Key | Type | Description |
---|---|---|
NewTestResults | array | Set of TestResult objects |
TestRunStatistics | object | See details below |
ActiveTests | array | Set of active or inprogress TestCase objects |
TestRunStatistics object has following structure
Key | Type | Description |
---|---|---|
ExecutedTests | number | Total number test executed |
Stats | object | Map for count of tests for each outcome |
Details of a TestResult
object is available in
appendix.
Details of a TestCase
object is available in
appendix.
{
"MessageType": "TestExecution.StatsChange",
"Payload": {
"NewTestResults": [
{
"TestCase": {
"Properties": [
{
"Key": {
"Id": "TestCase.FullyQualifiedName",
"Label": "FullyQualifiedName",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": "UnitTestProject.UnitTest.FailingTest"
},
{
"Key": {
"Id": "TestCase.ExecutorUri",
"Label": "Executor Uri",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Uri"
},
"Value": "executor://MSTestAdapter/v2"
},
{
"Key": {
"Id": "TestCase.Source",
"Label": "Source",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "UnitTestProject\\bin\\Debug\\netcoreapp1.0\\UnitTestProject.dll"
},
{
"Key": {
"Id": "TestCase.DisplayName",
"Label": "Name",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "FailingTest"
},
{
"Key": {
"Id": "MSTestDiscovererv2.IsEnabled",
"Label": "IsEnabled",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Boolean"
},
"Value": true
},
{
"Key": {
"Id": "MSTestDiscovererv2.TestClassName",
"Label": "ClassName",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": "UnitTestProject.UnitTest"
},
{
"Key": {
"Id": "TestObject.Traits",
"Label": "Traits",
"Category": "",
"Description": "",
"Attributes": 5,
"ValueType": "System.Collections.Generic.KeyValuePair`2[[System.String],[System.String]][]"
},
"Value": []
},
{
"Key": {
"Id": "TestCase.LineNumber",
"Label": "Line Number",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Int32"
},
"Value": 25
},
{
"Key": {
"Id": "TestCase.CodeFilePath",
"Label": "File Path",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "UnitTestProject\\UnitTest.cs"
}
]
},
"Attachments": [],
"Messages": [],
"Properties": [
{
"Key": {
"Id": "TestResult.DisplayName",
"Label": "TestResult Display Name",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": null
},
{
"Key": {
"Id": "TestResult.Duration",
"Label": "Duration",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.TimeSpan"
},
"Value": "00:00:10.0941957"
},
{
"Key": {
"Id": "TestResult.ErrorMessage",
"Label": "Error Message",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "Assert.AreEqual failed. Expected:<2>. Actual:<3>. "
},
{
"Key": {
"Id": "TestResult.ErrorStackTrace",
"Label": "Error Stack Trace",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": " at UnitTestProject.UnitTest.FailingTest() in UnitTestProject\\UnitTest.cs:line 27\r\n"
},
{
"Key": {
"Id": "TestResult.Outcome",
"Label": "Outcome",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "Microsoft.VisualStudio.TestPlatform.ObjectModel.TestOutcome, Microsoft.VisualStudio.TestPlatform.ObjectModel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
},
"Value": 2
},
{
"Key": {
"Id": "TestResult.StartTime",
"Label": "Start Time",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.DateTimeOffset"
},
"Value": "2017-01-25T16:22:42.0912112+05:30"
},
{
"Key": {
"Id": "TestResult.EndTime",
"Label": "End Time",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.DateTimeOffset"
},
"Value": "2017-01-25T16:22:52.1862902+05:30"
}
]
}
],
"TestRunStatistics": {
"ExecutedTests": 2,
"Stats": {
"Passed": 1,
"Failed": 1
}
},
"ActiveTests": [
{
"Properties": [
{
"Key": {
"Id": "TestCase.FullyQualifiedName",
"Label": "FullyQualifiedName",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": "UnitTestProject.UnitTest.SkippingTest"
},
{
"Key": {
"Id": "TestCase.ExecutorUri",
"Label": "Executor Uri",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Uri"
},
"Value": "executor://MSTestAdapter/v2"
},
{
"Key": {
"Id": "TestCase.Source",
"Label": "Source",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "UnitTestProject\\bin\\Debug\\netcoreapp1.0\\UnitTestProject.dll"
},
{
"Key": {
"Id": "TestCase.DisplayName",
"Label": "Name",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "SkippingTest"
},
{
"Key": {
"Id": "MSTestDiscovererv2.IsEnabled",
"Label": "IsEnabled",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Boolean"
},
"Value": false
},
{
"Key": {
"Id": "MSTestDiscovererv2.TestClassName",
"Label": "ClassName",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": "UnitTestProject.UnitTest"
},
{
"Key": {
"Id": "TestObject.Traits",
"Label": "Traits",
"Category": "",
"Description": "",
"Attributes": 5,
"ValueType": "System.Collections.Generic.KeyValuePair`2[[System.String],[System.String]][]"
},
"Value": []
},
{
"Key": {
"Id": "TestCase.LineNumber",
"Label": "Line Number",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Int32"
},
"Value": 36
},
{
"Key": {
"Id": "TestCase.CodeFilePath",
"Label": "File Path",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "UnitTestProject\\UnitTest.cs"
}
]
}
]
}
}
A TestExecution.Completed
message indicates completion of a test run.
Key | Type | Description |
---|---|---|
MessageType | string | TestExecution.Completed |
Payload | object | See details below |
Payload object has following structure.
Key | Type | Description |
---|---|---|
TestRunCompleteArgs | object | Summary of test run. See below |
LastRunTests | array | Set of TestResult for the last results batch |
RunAttachments | array | Test attachments for the run |
ExecutorUris | array | Set of executor uri for adapters that participated in the run |
TestRunCompleteArgs object has following structure.
Key | Type | Description |
---|---|---|
TestRunStatistics["ExecutedTests"] | number | Total tests executed |
TestRunStatistics["Stats"]["Passed"] | number | Passed tests count |
TestRunStatistics["Stats"]["Failed"] | number | Failed tests count |
TestRunStatistics["Stats"]["Skipped"] | number | Skipped tests count |
IsCanceled | boolean | true indicates a canceled run |
IsAborted | boolean | true indicates aborted run |
Error | string | Error during the run |
AttachmentSets | array | Array of run attachments |
ElapsedTimeInRunningTests | string | Duration for test run |
{
"MessageType": "TestExecution.Completed",
"Payload": {
"TestRunCompleteArgs": {
"TestRunStatistics": {
"ExecutedTests": 7,
"Stats": {
"Passed": 4,
"Failed": 2,
"Skipped": 1
}
},
"IsCanceled": false,
"IsAborted": false,
"Error": null,
"AttachmentSets": [],
"ElapsedTimeInRunningTests": "00:00:00.1820000"
},
"LastRunTests": null,
"RunAttachments": [],
"ExecutorUris": [
"executor://mstestadapter/v2"
]
}
}
Run selected tests operation differs from Run All tests in the request. The responses from test platform are same as above.
Key | Type | Description |
---|---|---|
MessageType | string | TestExecution.RunSelectedWithDefaultHost |
Payload | object | See below for details |
Payload for TestExecution.RunSelectedWithDefaultHost
has following structure.
Key | Type | Description |
---|---|---|
Sources | array | Set of test containers. Null in this case |
TestCases | array | Set of TestCase objects. Required. |
RunSettings | string | Run settings for the test run |
KeepAlive | boolean | Reserved for future |
DebuggingEnabled | boolean | true indicates a test run under debugger |
Note that TestCases must be a valid set of TestCase
objects, these should
represent user's test selection.
{
"MessageType": "TestExecution.RunAllWithDefaultHost",
"Payload": {
"Sources": null,
"TestCases": [
{
"Properties": [
{
"Key": {
"Id": "TestCase.FullyQualifiedName",
"Label": "FullyQualifiedName",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": "UnitTestProject.UnitTest.PassingTest"
},
{
"Key": {
"Id": "TestCase.ExecutorUri",
"Label": "Executor Uri",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Uri"
},
"Value": "executor://MSTestAdapter/v2"
},
{
"Key": {
"Id": "TestCase.Source",
"Label": "Source",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": ".\\samples\\UnitTestProject\\bin\\Debug\\netcoreapp1.0\\UnitTestProject.dll"
},
{
"Key": {
"Id": "TestCase.DisplayName",
"Label": "Name",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "PassingTest"
},
{
"Key": {
"Id": "MSTestDiscovererv2.IsEnabled",
"Label": "IsEnabled",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Boolean"
},
"Value": true
},
{
"Key": {
"Id": "MSTestDiscovererv2.TestClassName",
"Label": "ClassName",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": "UnitTestProject.UnitTest"
},
{
"Key": {
"Id": "TestObject.Traits",
"Label": "Traits",
"Category": "",
"Description": "",
"Attributes": 5,
"ValueType": "System.Collections.Generic.KeyValuePair`2[[System.String],[System.String]][]"
},
"Value": []
}
]
}
],
"RunSettings": null,
"KeepAlive": false,
"DebuggingEnabled": false
}
}
This request will cancel the current test run request.
Key | Type | Description |
---|---|---|
MessageType | string | TestExecution.Cancel |
Payload | object | null |
{
"MessageType": "TestExecution.Cancel",
"Payload": null
}
This request will abort the current test run request.
Key | Type | Description |
---|---|---|
MessageType | string | TestExecution.Abort |
Payload | object | null |
{
"MessageType": "TestExecution.Abort",
"Payload": null
}
Debug all or selected test operations follow this sequence:
- Request for the process to be launched under debugger (along with start parameters).
TestSession.GetTestRunnerProcessStartInfoForRunAll
andTestSession.GetTestRunnerProcessStartInfoForRunSelected
messages need to be sent for DebugAll and DebugSelected operation respectively. - Runner responds with a
TestSession.CustomTestHostLaunch
message. It has the executable which needs to be launched with debugger attached. - After starting the host process, send
TestSession.CustomTestHostLaunchCallback
as an acknowledgment to the runner.
After this, runner sends TestRunStatsChange and TestExecutionComplete events similar to a RunAll operation.
The request to get the Process StartInfo for the Test host.
Key | Type | Description |
---|---|---|
MessageType | string | TestSession.GetTestRunnerProcessStartInfoForRunAll |
Payload | object | See details below |
Payload object is has following structure.
Key | Type | Description |
---|---|---|
Sources | array | Set of test containers. Required |
TestCases | array | Set of TestCase objects. Null in this case. |
RunSettings | string | Run settings for the test run |
KeepAlive | boolean | Reserved for future |
DebuggingEnabled | boolean | true indicates a test run under debugger |
{
"MessageType": "TestExecution.GetTestRunnerProcessStartInfoForRunAll",
"Payload": {
"Sources": [
"E:\\git\\singh\\vstest\\samples\\UnitTestProject\\bin\\Debug\\netcoreapp1.0\\UnitTestProject.dll"
],
"TestCases": null,
"RunSettings": null,
"KeepAlive": false,
"DebuggingEnabled": true
}
}
The request to get the Process StartInfo for the Test host.
Key | Type | Description |
---|---|---|
MessageType | string | TestSession.GetTestRunnerProcessStartInfoForRunSelected |
Payload | object | See details below |
Payload object is has following structure.
Key | Type | Description |
---|---|---|
Sources | array | Set of test containers. Null in this case. |
TestCases | array | Set of TestCase objects. Required |
RunSettings | string | Run settings for the test run |
KeepAlive | boolean | Reserved for future |
DebuggingEnabled | boolean | true indicates a test run under debugger |
{
"MessageType": "TestExecution.GetTestRunnerProcessStartInfoForRunSelected",
"Payload": {
"Sources": null,
"TestCases": [
{
"Properties": [
{
"Key": {
"Id": "TestCase.FullyQualifiedName",
"Label": "FullyQualifiedName",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": "UnitTestProject.UnitTest.PassingTest"
},
{
"Key": {
"Id": "TestCase.ExecutorUri",
"Label": "Executor Uri",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Uri"
},
"Value": "executor://MSTestAdapter/v2"
},
{
"Key": {
"Id": "TestCase.Source",
"Label": "Source",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "E:\\git\\singh\\vstest\\samples\\UnitTestProject\\bin\\Debug\\netcoreapp1.0\\UnitTestProject.dll"
},
{
"Key": {
"Id": "TestCase.DisplayName",
"Label": "Name",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "PassingTest"
},
{
"Key": {
"Id": "MSTestDiscovererv2.IsEnabled",
"Label": "IsEnabled",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Boolean"
},
"Value": true
},
{
"Key": {
"Id": "MSTestDiscovererv2.TestClassName",
"Label": "ClassName",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": "UnitTestProject.UnitTest"
},
{
"Key": {
"Id": "TestObject.Traits",
"Label": "Traits",
"Category": "",
"Description": "",
"Attributes": 5,
"ValueType": "System.Collections.Generic.KeyValuePair`2[[System.String],[System.String]][]"
},
"Value": []
},
{
"Key": {
"Id": "TestCase.LineNumber",
"Label": "Line Number",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Int32"
},
"Value": 16
},
{
"Key": {
"Id": "TestCase.CodeFilePath",
"Label": "File Path",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "E:\\git\\singh\\vstest\\samples\\UnitTestProject\\UnitTest.cs"
}
]
}
],
"RunSettings": null,
"KeepAlive": false,
"DebuggingEnabled": true
}
}
CustomTestHostLaunch is the response to GetTestRunnerProcessStartInfoRunAll/GetTestRunnerProcessStartInfoRunSelected request. This message contains the StartInfo for the testhost process.
Key | Type | Description |
---|---|---|
MessageType | string | TestSession.CustomTestHostLaunch |
Payload | object | See details below |
Payload object is has following structure.
Key | Type | Description |
---|---|---|
FileName | string | Name of the host process |
Arguments | string | Arguments to be passed to the host process |
WorkingDirectory | string | Working directory for the host process |
EnvironmentVariables | array | Environment variables associated with host process |
CustomProperties | array | Any custom properties that need to set |
{
"MessageType": "TestExecution.CustomTestHostLaunch",
"Payload": {
"FileName": "C:\\Program Files\\dotnet\\dotnet.exe",
"Arguments": "exec --runtimeconfig \"UnitTestProject\\bin\\Debug\\netcoreapp1.0\\UnitTestProject.runtimeconfig.json\" --depsfile \"E:\\git\\singh\\vstest\\samples\\UnitTestProject\\bin\\Debug\\netcoreapp1.0\\UnitTestProject.deps.json\" \"E:\\git\\packages\\microsoft.testplatform.testhost/15.0.0-preview-20170106-08\\lib/netstandard1.5/testhost.dll\" --port 64531 --parentprocessid 12292",
"WorkingDirectory": "vstest\\samples\\Microsoft.TestPlatform.Protocol",
"EnvironmentVariables": {},
"CustomProperties": null
}
}
CustomTestHostLaunchCallback is the acknowledgement sent to the runner after starting the host process.
Key | Type | Description |
---|---|---|
MessageType | string | TestSession.CustomTestHostLaunchCallback |
Payload | object | See details below |
Payload object is has following structure.
Key | Type | Description |
---|---|---|
HostProcessId | number | Process Id of the host process |
ErrorMessage | string | Error message in case host process does not start |
{
"MessageType": "TestExecution.CustomTestHostLaunchCallback",
"Payload": {
"HostProcessId": 53572,
"ErrorMessage": null
}
}
The log messages are sent as TestSession.Message
. Error messages are also reported via this message response.
Key | Type | Description |
---|---|---|
MessageType | string | TestSession.Message |
Payload | object | See details below |
Payload object is has following structure.
Key | Type | Description |
---|---|---|
MessageLevel | number | Represent the TestMessageLevel. See details below |
Message | string | The actual message reported by the runner. |
MessageLevel provides an integer specifying the type of log message. Possible values are:
0x0
: Informational0x1
: Warning0x2
: Error
Example
{
"MessageType": "TestSession.Message",
"Payload": {
"MessageLevel" : 1,
"Message" : "The test run was aborted."
}
}
This request is used to the end the current test session.
Key | Type | Description |
---|---|---|
MessageType | string | TestSession.Terminate |
Payload | object | null |
{
"MessageType": "TestSession.Terminate",
"Payload": null
}
A Message
is basic data unit for the Editor and Test Platform communication
protocol.
Structure
Key | Type | Description |
---|---|---|
MessageType | string | Type of message |
Payload | object | Payload for an operation input or output. Can be null. |
Example
{
"MessageType": "TestSession.Connected",
"Payload": null
}
Each Property
is a <Key, Value> pair as shown below.
Key | Type | Description |
---|---|---|
Key | object | Definition of a Property. See below. |
Value | string | Value of the Property |
The Key
identifies the property and Value
is the data. Further a Key
is
defined as follows:
Key | Type | Description |
---|---|---|
Id | object | Definition of a Property |
Label | string | Value of the Property |
Category | string | Type of a Property. Reserved for future. |
Description | string | Description of a Property. |
Attributes | number | Various attributes of this Property. See below. |
ValueType | string | A .net type that represents the Value |
Attributes
are a bitwise OR
of following values:
0x0
: None (default)0x1
: Hidden. Should be set for hidden properties.0x2
: Immutable. Should be set of properties that are readonly.0x4
: Trait (Deprecated). Should be set if a Property is a Trait.
A TestCase
is a set of Property
elements. Every testcase object must have following properties:
- TestCase.FullyQualifiedName represents the unique name for a test case.
{
"Key": {
"Id": "TestCase.FullyQualifiedName",
"Label": "FullyQualifiedName",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": "UnitTestProject.UnitTest.TestWithPriority"
}
- TestCase.ExecutorUri represents the Adapter which owns this test case.
{
"Key": {
"Id": "TestCase.ExecutorUri",
"Label": "Executor Uri",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.Uri"
},
"Value": "executor://MSTestAdapter/v2"
}
- TestCase.Source is the path to the test container which contains the source of this test case.
{
"Key": {
"Id": "TestCase.Source",
"Label": "Source",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": ".\\samples\\UnitTestProject\\bin\\Debug\\netcoreapp1.0\\UnitTestProject.dll"
}
- TestCase.DisplayName represents a user friendly notation for the test case. An editor or a runner can choose to show this to user.
{
"Key": {
"Id": "TestCase.DisplayName",
"Label": "Name",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "TestWithPriority"
}
- TestCase.Traits are a set of <Key, Value> pair of additional data related to a test case. User can use these values to filter tests. An editor or runner may show this to user.
{
"Key": {
"Id": "TestObject.Traits",
"Label": "Traits",
"Category": "",
"Description": "",
"Attributes": 5,
"ValueType": "System.Collections.Generic.KeyValuePair`2[[System.String],[System.String]][]"
},
"Value": [
{
"Key": "Priority",
"Value": "0"
}
]
}
Apart from these properties, a TestCase
object may have adapter specific
properties.
A TestResult
object represents the result of a test case execution. It has the
following structure.
Key | Type | Description |
---|---|---|
TestCase | object | TestCase that executed |
Attachments | array | Paths to test attachments |
Messages | array | Set of messages generated during test execution |
Properties | array | Set of Property for this result |
These are the mandatory properties available in every TestResult
object.
- TestResult.DisplayName provides a friendly name for the test result.
{
"Key": {
"Id": "TestResult.DisplayName",
"Label": "TestResult Display Name",
"Category": "",
"Description": "",
"Attributes": 1,
"ValueType": "System.String"
},
"Value": ""
}
- TestResult.Duration provides the entire duration of this test case execution.
{
"Key": {
"Id": "TestResult.Duration",
"Label": "Duration",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.TimeSpan"
},
"Value": "00:00:00.0306600"
}
- TestResult.ErrorMessage provides an error message if the test failed.
{
"Key": {
"Id": "TestResult.ErrorMessage",
"Label": "Error Message",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": "Assert.AreEqual failed. Expected:<2>. Actual:<3>. "
}
- TestResult.ErrorStackTrace provides the stack trace for the error.
{
"Key": {
"Id": "TestResult.ErrorStackTrace",
"Label": "Error Stack Trace",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.String"
},
"Value": " at UnitTestProject.UnitTest.FailingTest() in D:\\dd\\gh\\Microsoft\\vstest\\samples\\UnitTestProject\\UnitTest.cs:line 26\r\n"
}
- TestResult.Outcome provides an integer specifying the result of a test
case execution.
Possible outcomes are:
0x0
: None. Test case doesn't have an outcome.0x1
: Passed0x2
: Failed0x3
: Skipped0x4
: Not found. Test case was not found during execution.
{
"Key": {
"Id": "TestResult.Outcome",
"Label": "Outcome",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "Microsoft.VisualStudio.TestPlatform.ObjectModel.TestOutcome, Microsoft.VisualStudio.TestPlatform.ObjectModel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
},
"Value": 2
}
- TestResult.StartTime provides the start time of the test case execution.
{
"Key": {
"Id": "TestResult.StartTime",
"Label": "Start Time",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.DateTimeOffset"
},
"Value": "2017-01-06T10:15:39.9907073+05:30"
}
- TestResult.EndTime provides the end time of test case execution.
{
"Key": {
"Id": "TestResult.EndTime",
"Label": "End Time",
"Category": "",
"Description": "",
"Attributes": 0,
"ValueType": "System.DateTimeOffset"
},
"Value": "2017-01-06T10:15:40.021772+05:30"
}
The test runner needs the target framework for running the tests using the appropriate hosting environment. It can be set using TargetFrameworkVersion node in the RunSettings passed as part of discovery/execution request. TargetFrameworkVersion value is the fullname of the target framework. For example, ".NETFramework,Version=v4.5.2". Other supported .Net Framework version shortcuts are Framework35, Framework40 and Framework45.
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<RunSettings>
<RunConfiguration>
<TargetFrameworkVersion>.NETFramework,Version=v4.5.2</TargetFrameworkVersion>
</RunConfiguration>
</RunSettings>
{
"MessageType": "TestExecution.RunAllWithDefaultHost",
"Payload": {
"Sources": [
"E:\\UnitTest1\\UnitTest1\\bin\\Debug\\net452\\UnitTest1.dll"
],
"TestCases": null,
"RunSettings": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<RunSettings>\r\n<RunConfiguration>\r\n<TargetFrameworkVersion>Framework45</TargetFrameworkVersion>\r\n</RunConfiguration>\r\n</RunSettings>",
"KeepAlive": false,
"DebuggingEnabled": false
}
}