[{"data":1,"prerenderedAt":298},["ShallowReactive",2],{"page-\u002Fcsharp\u002Fwpf\u002Fwpf的mstest-sdk单yuan测试":3},{"id":4,"title":5,"body":6,"description":12,"extension":291,"meta":292,"navigation":293,"path":294,"seo":295,"stem":296,"__hash__":297},"content\u002Fcsharp\u002FWPF\u002Fwpf的mstest-sdk单元测试.md","Wpf的mstest Sdk单元测试",{"type":7,"value":8,"toc":285},"minimark",[9,13,30,44,62,80,94,101,111,118,192,198],[10,11,12],"p",{},"​\t我们一般使用MSTest 测试项目，其中在创建单元测试项目的时候会遇到两个选择，就是问我们需不需要 Test Runner 。Test Runner有VSTest和 MSTest两个选项。 以及选择覆盖工具：Microsoft.CodeCoverage。",[10,14,15,16,20,21,25,26,29],{},"​\t",[17,18,19],"code",{},"MSTest.Sdk"," 是一个 ",[22,23,24],"strong",{},"MSBuild Project SDK","，可以看作是一个“便利包”，它简化了 MSTest 测试项目的 ",[17,27,28],{},".csproj"," 文件配置。不一定要使用他它，因为一般情况下已经默认配置好了。",[10,31,32,33,35,36,39,40,43],{},"​\t一个项目文件（",[17,34,28],{},"）顶部的 ",[17,37,38],{},"Sdk=\"...\""," 声明了该项目的“类型”，它",[22,41,42],{},"决定了项目如何被编译和处理","。",[45,46,47,54],"ul",{},[48,49,50,53],"li",{},[17,51,52],{},"Microsoft.NET.Sdk",": 这是标准的 .NET 项目 SDK，用于编译类库、控制台应用等。",[48,55,56,58,59],{},[17,57,19],{},": 这是一个专门为 ",[22,60,61],{},"MSTest 项目准备的 SDK。",[10,63,64,65,68,69,72,73,76,77,43],{},"​\t接下来是覆盖工具的讲解。这是一个",[22,66,67],{},"代码覆盖率 (Code Coverage)"," 分析工具。它用来衡量您的",[22,70,71],{},"单元测试","在多大程度上",[22,74,75],{},"执行了您的业务代码","，是评估",[22,78,79],{},"测试完备性的一个重要指标",[10,81,82,83,86,87,90,91],{},"​\t接下来是固定例程，也可以叫做测试脚手架，或者测试上下文，它的核心思想是为一组相关的测试",[22,84,85],{},"准备一个稳定、可重复的“初始状态” (Setup)","，并在测试结束后",[22,88,89],{},"清理现场 (Teardown)","，以",[22,92,93],{},"确保每个测试都在独立、干净的环境中运行，互不干扰。",[95,96,98],"h3",{"id":97},"mstest-中的四种核心脚手架",[22,99,100],{},"MSTest 中的四种核心“脚手架”",[10,102,103,104,107,108,43],{},"​\t它们分为两组，一组针对",[22,105,106],{},"每个测试方法","，另一组针对",[22,109,110],{},"整个测试类",[112,113,115],"h4",{"id":114},"第一组-每次测试都执行",[22,116,117],{},"第一组: 每次测试都执行",[45,119,120,158],{},[48,121,122,127],{},[22,123,124],{},[17,125,126],{},"[TestInitialize]",[45,128,129,146,152],{},[48,130,131,134,135,138,139,138,142,145],{},[22,132,133],{},"作用",": 在",[22,136,137],{},"每一个"," ",[17,140,141],{},"[TestMethod]",[22,143,144],{},"运行之前","，都会执行一次被此特性标记的方法。",[48,147,148,151],{},[22,149,150],{},"比喻",": 就像每次考试前，都给你一张全新的、干净的草稿纸。",[48,153,154,157],{},[22,155,156],{},"用途",": 创建被测对象的新实例、重置变量、准备临时的测试数据等，确保每个测试的起点都是一致的。",[48,159,160,165],{},[22,161,162],{},[17,163,164],{},"[TestCleanup]",[45,166,167,179,184],{},[48,168,169,134,171,138,173,138,175,178],{},[22,170,133],{},[22,172,137],{},[17,174,141],{},[22,176,177],{},"运行之后","，都会执行一次。",[48,180,181,183],{},[22,182,150],{},": 考完一门就把那张草稿纸扔掉，不影响下一门考试。",[48,185,186,188,189,191],{},[22,187,156],{},": 释放 ",[17,190,126],{}," 中创建的资源、删除临时文件、将数据库恢复到测试前的状态等。",[112,193,195],{"id":194},"第二组-每个测试类只执行一次",[22,196,197],{},"第二组: 每个测试类只执行一次",[45,199,200,248],{},[48,201,202,207],{},[22,203,204],{},[17,205,206],{},"[ClassInitialize]",[45,208,209,217,222,231],{},[48,210,211,213,214,43],{},[22,212,133],{},": 在一个测试类中，",[22,215,216],{},"所有测试方法开始运行之前，只执行一次",[48,218,219,221],{},[22,220,150],{},": 就像在新学期开始时，学校为你准备好了整个学期都会用到的教室和桌椅。",[48,223,224,226,227,230],{},[22,225,156],{},": 用于执行那些",[22,228,229],{},"开销很大、但只需进行一次","的初始化操作，例如建立数据库连接、加载大型配置文件、启动一个模拟服务器等。",[48,232,233,236,237,243,244,247],{},[22,234,235],{},"注意",": 此方法",[22,238,239,240],{},"必须是 ",[17,241,242],{},"public static","，并且必须接受一个 ",[17,245,246],{},"TestContext"," 类型的参数。",[48,249,250,255],{},[22,251,252],{},[17,253,254],{},"[ClassCleanup]",[45,256,257,264,269,277],{},[48,258,259,213,261,43],{},[22,260,133],{},[22,262,263],{},"所有测试方法全部运行完毕之后，只执行一次",[48,265,266,268],{},[22,267,150],{},": 学期结束后，打扫整个教室。",[48,270,271,273,274,276],{},[22,272,156],{},": 用于释放 ",[17,275,206],{}," 中创建的昂贵资源。",[48,278,279,236,281,43],{},[22,280,235],{},[22,282,239,283],{},[17,284,242],{},{"title":286,"searchDepth":287,"depth":287,"links":288},"",2,[289],{"id":97,"depth":290,"text":100},3,"md",{},true,"\u002Fcsharp\u002Fwpf\u002Fwpf的mstest-sdk单yuan测试",{"description":12},"csharp\u002FWPF\u002Fwpf的mstest-sdk单元测试","6fWzA-HgZygWvArJ2E5bkGTbNlkoHrgihBhDFdLiLuY",1791042466035]