PageSourceSearch

https://stryker-mutator.io/assets/js/a4d497e3.908cfa22.js

js stryker-mutator.io collected 2026-10-02 03:26:41 UTC 7,505 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkstryker_mutator_github_io=self.webpackChunkstryker_mutator_github_io||[]).push([["825"],{17608:function(e,t,s){s.r(t),s.d(t,{metadata:function(){return n},default:function(){return d},frontMatter:function(){return o},contentTitle:function(){return a},toc:function(){return c},assets:function(){return l}});var n=JSON.parse('{"id":"stryker-net/technical-reference/VsTest internal","title":"VsTest internals","description":"Objective","source":"@site/docs/stryker-net/technical-reference/VsTest internal.md","sourceDirName":"stryker-net/technical-reference","slug":"/stryker-net/technical-reference/VsTest internal","permalink":"/docs/stryker-net/technical-reference/VsTest internal","draft":false,"unlisted":false,"editUrl":"https://github.com/stryker-mutator/stryker-mutator.github.io/edit/develop/docs/stryker-net/technical-reference/VsTest internal.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docs","previous":{"title":"Stryker\u2019s crash course on C# syntax parsing and mutation","permalink":"/docs/stryker-net/technical-reference/Mutation Orchestration Design"},"next":{"title":"Getting started","permalink":"/docs/stryker4s/getting-started"}}'),r=s(94686),i=s(23191);let o={},a="VsTest internals",l={},c=[{value:"Objective",id:"objective",level:2},{value:"Test platform architecture in a nutshell",id:"test-platform-architecture-in-a-nutshell",level:2},{value:"Zoom on features",id:"zoom-on-features",level:2},{value:"End of test sessions",id:"end-of-test-sessions",level:3},{value:"Timeout",id:"timeout",level:3},{value:"Known issues (As of VsTest 17.6,)",id:"known-issues-as-of-vstest-176",level:4}];function h(e){let t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"vstest-internals",children:"VsTest internals"})}),"\n",(0,r.jsx)(t.h2,{id:"objective",children:"Objective"}),"\n",(0,r.jsx)(t.p,{children:"This document captures knowledge gathered while working on Stryker regarding VsTest related issues. It exists to assist anyone trying to analyse testing problems.\nIt provides architecture and design description, as well as known limitations and bugs (including github issue number when relevant)."}),"\n",(0,r.jsx)(t.h2,{id:"test-platform-architecture-in-a-nutshell",children:"Test platform architecture in a nutshell"}),"\n",(0,r.jsxs)(t.p,{children:["VsTest is architectured to be platform and language neutral.\nFrom a coder perspective, when one instantiates a session instance (a ",(0,r.jsx)(t.code,{children:"IVSTestConsoleWrapper"})," class),\nthis translates to launching a VsTest server process. Its purpose is to carry out test requests\nand to send back the results to the client (process).\nWhen a test session starts, the server process will determine the needed platform\nand framework version and starts the adequate test host process that will ultimately perform the tests.\nNote that the server process may launch multiple test hosts, such as when the test session covers assemblies\nhaving different platform/framework constraints, and/or to speed up the process via parallelization."]}),"\n",(0,r.jsx)(t.p,{children:"The server process is then responsible to coordinate all this processes and to forward test results to the client\nin a controlled manner."}),"\n",(0,r.jsxs)(t.p,{children:["Ample documentation is available on GiHub: ",(0,r.jsx)(t.a,{href:"https://github.com/microsoft/vstest",children:"https://github.com/microsoft/vstest"})]}),"\n",(0,r.jsx)(t.h2,{id:"zoom-on-features",children:"Zoom on features"}),"\n",(0,r.jsx)(t.h3,{id:"end-of-test-sessions",children:"End of test sessions"}),"\n",(0,r.jsxs)(t.p,{children:["A client gets the test result via a dedicated handler object (implementing ",(0,r.jsx)(t.code,{children:"ITestRunEventsHandler"}),") that receives notifications\nwhen new test results are available and when the test session ends.\nBut the session is also seen as a task, either explicitely when using the async API, or implicitely when using the sync ver
1sion: the task\nis completed/control is returned to the caller when the test session is over."]}),"\n",(0,r.jsx)(t.h3,{id:"timeout",children:"Timeout"}),"\n",(0,r.jsx)(t.p,{children:"VsTest supports time out since V 15.5. That is, one can provide a maximum execution time for the test session,\nand VsTest will automatically stops the test session if it is still running when the time is elapsed."}),"\n",(0,r.jsx)(t.h4,{id:"known-issues-as-of-vstest-176",children:"Known issues (As of VsTest 17.6,)"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Cancelled test sessions may never end: VsTest may not report the end of a cancelled test session when more than one testhost process was required.\nNote that this also applies to session cancelled by the timeout logic. When this happen, the endsession event is not raised, but the task does end."}),"\n",(0,r.jsx)(t.li,{children:"Crashed test sessions (StackOverflow, OutOfMemory....) may appear as timeout. Note that the (VsTest) logs will reflect the crash, but the VsTest server\nsession will still wait for the end session event"}),"\n",(0,r.jsx)(t.li,{children:"Providing an incorrect TestSettings file will result in nothing happening, without any error report. This happens if the file is corrupted as well as with a negative timeouts"}),"\n",(0,r.jsx)(t.li,{children:"Some settings will be reported in the logs as not recognized or obsolete, but they are still needed by some test adapters"}),"\n",(0,r.jsxs)(t.li,{children:["The error message ",(0,r.jsx)(t.code,{children:"process failed to connect to vstest.console"})," might indicate that the OS is providing a different version of OpenSSL\nthan what VsTest expects. For example, Arch provides OpenSSL3, whereas VsTest expects OpenSSL1. A more\ndetailed stack trace might reveal the error ",(0,r.jsx)(t.code,{children:"No usable version of libssl was found"}),". In this case\nyou can try the following workaround:","\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Install ",(0,r.jsx)(t.code,{children:"openssl-1.1"})," (on Arch: ",(0,r.jsx)(t.code,{children:"yay -S openssl1.1"}),"). This does not change the default openssl (currently 3.2). It does not require any linking of files!"]}),"\n",(0,r.jsxs)(t.li,{children:["Add the following environment variable before running stryker:\n",(0,r.jsx)(t.code,{children:"CLR_OPENSSL_VERSION_OVERRIDE=1.1"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Example usage: ",(0,r.jsx)(t.code,{children:"alias stryker='export CLR_OPENSSL_VERSION_OVERRIDE=1.1 && dotnet stryker'"})]}),"\n",(0,r.jsxs)(t.li,{children:["For details see the following Github issue: ",(0,r.jsx)(t.a,{href:"https://github.com/stryker-mutator/stryker-net/issues/2799",children:"https://github.com/stryker-mutator/stryker-net/issues/2799"})]}),"\n"]}),"\n"]}),"\n"]})]})}function d(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},23191:function(e,t,s){s.d(t,{R:function(){return o},x:function(){return a}});var n=s(92990);let r={},i=n.createContext(r);function o(e){let t=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.