Visual Studio 号称有史以来最强大的IDE,确实如此。创建单元测试也是一键完成:在方法的代码块中右键“Create Unit Test…”,勾选测试项,填项目名,完成。VS就会自动帮你创建好了一个工程,直接写测试方法就好。这创建出来的工程也就是一个普通的类库(class library),所以今天我就打算手动创建一个单元测试工程,但是最后却发现总是无法显示代码覆盖率。

发现问题,解决问题:反复对比手动创建和自动创建的工程,所有的属性都没区别。但是有一点引起了我的注意,右键工程名-Add,区别出来了:

自动创建的Unit Test类库好像被打上了标签,能够被VS识别为单元测试工程。但是所有的工程属性对比后都一样,然后我就想到了另外一个文件.csproj,看这个后缀名就知道这个文件的作用了:C Sharp Project,用来记录工程项目的一些信息。对比这两个项目的.csproj文件就能找出来差别了,自动创建的单元测试工程多了一条标签:

 1 <PropertyGroup>

 2 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>

 3 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>

 4 <ProductVersion>8.0.30729</ProductVersion>

 5 <SchemaVersion>2.0</SchemaVersion>

 6 <ProjectGuid>{4D38A077-23EE-4E9F-876A-43C33433FFEB}</ProjectGuid>

 7 <OutputType>Library</OutputType>

 8 <AppDesignerFolder>Properties</AppDesignerFolder>

 9 <RootNamespace>Example.ManualUnitTest</RootNamespace>

 <AssemblyName>Example.ManualUnitTest</AssemblyName>

 <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>

 <FileAlignment>512</FileAlignment>

 <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

 </PropertyGroup>

多了ProjectTypeGuids这个标签,查了资料两个guid分别对应的是:

  • Guid {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}:  C# project
  • Guid {3AC096D0-A1C2-E12C-1390-A8335801FDAB}: “Test Project Flavor”

这样子VS就能识别出这个项目是个Test Project了。如果是VB.net工程的话,第一个GUID就要换成{F184B08F-C81C-45F6-A57F-5ABD9991F28F}。

这个解决了代码覆盖率就正常了。

这里记录一下手动创建单元测试工程的步骤,以备日后查阅:

  1. 创建一个“Class Library”工程,添加Microsoft.VisualStudio.QualityTools.UnitTestFramework引用,和需要测试工程的应用
  2. 右键新建的工程-“Unload Project”;卸载了之后,再右键-“Edit xxxx.csproj”;在第一个ProjectGroup标签中加入<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>;保存之后就可以右键工程-“Reload Project”
  3. 右键Solution,创建新项,选择Test Setting,确定之后在弹出来的窗口按如下配置:(如果solution中已有Local.testsettings文件就不需要创建了,直接双击)

    点击config,选择需要测试工程的dll就可以了。

  4. 在VS菜单栏中选择Test-Windows-Code Coverage Results
  5. 完成,可以开始编写单元测试了

手动创建VS单元测试,显示代码覆盖率的更多相关文章

  1. Java开发工具IntelliJ IDEA单元测试和代码覆盖率图解

    原文 http://www.cnblogs.com/xiongmaopanda/p/3314660.html Java开发工具IntelliJ IDEA使用教程:单元测试和代码覆盖率 本文将展示如何使 ...

  2. Jenkins构建Android项目持续集成之单元测试及代码覆盖率

    单元测试 在软件开发中一直在推崇TDD(测试驱动开发),但是一直不能被有效的执行或者并不是真正的测试驱动开发(先开发后写单元测试),因为我们懒!而Android开发又是大多应用层面的开发,很多都是和视 ...

  3. Maven快速入门(二)手动创建maven项目hellomaven

    之前讲过Maven介绍及环境搭建,介绍了maven的作用和如何搭建maven环境.接下来就以一个helloworld的例子来说一说如何创建maven项目以及maven项目的项目结构,最后讲maven如 ...

  4. java web(一) 使用sql标签库+tomcat+mysql手动创建一个jsp练习总结

    2016-09-0111:06:53                                     使用sql标签库+tomcat+mysql手动创建一个jsp 1. 1.1安装tomcat ...

  5. servlet和手动创建servlet,断点调试

    1.    什么是Servlet Servlet是一种用Java语言编写的Web应用组件 Servlet主要用于动态网页输出,扩展了Web服务器的功能 Servlet由Servlet容器进行管理 2. ...

  6. 如何在JavaScript中手动创建类数组对象

    前言 关于什么是js的类数组对象这里不再赘述.可以参考这个链接,还有这里. js中类数组对象很多,概念简单的讲就是看上去像数组,又不是数组,可以使用数字下标方式访问又没有数组方法. 例: argume ...

  7. ogre3D学习基础16 -- 手动创建实体(ManualObject)

    这一节练习一下手动创建实体,用到了对象(ManualObject) 第一,依然是模板 #include "ExampleApplication.h" class Example1 ...

  8. Laravel中我们登录服务器通过 Tinker 手动创建后台管理用户

    Laravel中我们可以登录到服务器通过 Tinker 手动创建后台用户 laravel中tinker命令的作用是用来调试laravel,可以打印变量或对象信息,显示函数代码,对数据库写入和查询数据. ...

  9. NetworkX系列教程(3)-手动创建graph

    小书匠Graph图论 不可否认,日常中我们使用最多的还是,使用自己的数据去手动创建自己的图形,而不是使用生成器,现从给graph添加点和边入手,讲解手动创建graph. 目录: 3.给graph添加节 ...

随机推荐

  1. How to select Multiple images from UIImagePickerController [duplicate]

    accepted You have to use custom imagepicker. And I think ELCImagePickerController is the best option ...

  2. MySQL的用户和权限介绍

    一.关于MySQL权限的几点常识: 1.MySQL的权限系统主要用来验证用户的操作权限. 2.在MySQL内部,权限信息存放在MySQL数据库的granttable里.当mysql启动后,grantt ...

  3. Android入门(十七)Android多线程

    原文链接:http://www.orlion.ga/670/ 一.在子线程中更新UI Android中不允许在子线程中更新UI,只能在主线程中更新,但是我们有时候必须在子线程中执行一些耗时的任务,然后 ...

  4. javascript中关于日期和时间的基础知识

    × 目录 [1]标准时间 [2]字符串 [3]闰年[4]月日[5]星期[6]时分秒 前面的话 在介绍Date对象之前,首先要先了解关于日期和时间的一些知识.比如,闰年.UTC等等.深入了解这些,有助于 ...

  5. Ruby FFI 入门教程

    FFI是一个可以让用户使用Ruby调用C代码的gem.如果你需要执行一些系统底层调用,或者做一些高性能运算的话,FFI是一个很不错的选择. 1. 安装 执行gem install ffi即可.非常标准 ...

  6. 【知识积累】BufferedImage类实现图片的切分

    一.引言 如何实现图片分割?若有园友用到这个模块,使用Java的BufferedImage类来实现,图片切分也可以作为一个小工具积累起来,以备不时之需. 二.代码清单 package com.lees ...

  7. Azure China (12) 域名备案问题

    <Windows Azure Platform 系列文章目录> (1) 默认情况下,我们在创建的Azure 服务,默认使用的DNS地址为: http://xxx.chinacloudapi ...

  8. C#获取年龄段 几零后

    /// <summary> /// 根据年龄获得年龄段 /// </summary> /// <param name="age"></pa ...

  9. 多语言架构下如何正确的使用SQL视图

    产品的定位 做产品的都知道,是否支持多语言直接影响到产品的定位问题. 如果一个产品周期是一年的话,要完美支持多语言最少也得在加3个月!所需时间和页面数量.数据库表的数量和表的数据量成正比. 可以看出代 ...

  10. 深度浅出immutable.js

    这篇文章将讲述immutable.js的基本语法和用法. 1.fromJs()  Deeply converts plain JS objects and arrays to Immutable Ma ...