vs单元测试

    xiaoxiao2022-07-07  204

    VS2008本身集成有单元测试工具,我们可以拿来用一下,首先在创建测试的方法上右键,选择创建单元测试,如下图示:

    在弹出的对话框中,选择要测试的方法,如下图示:

    单击OK按钮,即可创建一个测试工程,工程创建好后,会看到如下代码:

    /// <summary> ///A test for Add ///</summary> [TestMethod()] public void AddTest() { int n = 10; // TODO: Initialize to an appropriate value int m = 0; // TODO: Initialize to an appropriate value int expected = 0; // TODO: Initialize to an appropriate value int actual; actual = TestedClass.Add(n, m); Assert.AreEqual(expected, actual); Assert.Inconclusive("Verify the correctness of this test method."); }

    代码 这就是自动为我们创建好的代码了,很简单,可以自己修改一下测试用例,然后点击运行工程就可以运行了,会看到如下图示的运行结果:

    这里显示了测试的情况,还可以双击查看具体测试报告,并且可以将测试报告导出。

    当然,如果我们还想再添加被测试的方法也很简单,如,我用下面这段代码增加了对Minus方法的测试

    [TestMethod] public void MinusTest() { int n = 10; int m = 1; int result = 10; Assert.AreEqual(TestedClass.Minus(n, m), result); }

    代码 现在可以直接点RUN运行了。

    VSTS还提供了查看代码覆盖指标。

    他包含了一个代码覆盖工具,可以详细解释被执行代码的覆盖率,并突出显示哪些代码被执行,哪些代码没有被执行。VSTS 在生成单元测试框架时,默认没有启用“代码覆盖”功能。

    首先打开“本地测试运行配置文件” localtestrun.testrunconfig , 双击localtestrun.testrunconfig”文件,弹出该对话框窗口。 如下图示:

    在其对话框窗口的左侧选择“代码覆盖率”,然后在右侧的“要检测的项目”中选择要检测的项目。 单击“apply”按钮。

    在“代码覆盖率结果”窗口中可查看代码覆盖率。 在“代码覆盖率结果”窗口中,我们还可以查看单元测试中代码覆盖的块数,以及代码覆盖的百分比信息。如下图示:

    VS2008的单元测试可以集成NUnit也可以使用他自带的,这个可以以自己的喜好来进行选择,我个人比较喜欢Nunit方式。

    VS2008的本身单元测试不仅可以显示测试结果,还可以显示覆盖率等信息,操作比较方便。NUnit轻量,开源,与其它工具整合性好,易于实现自动化测试,要显示覆盖率还要集成NCover,我会在下篇文章进行介绍如何集成。 1 背景 测试是开发的一个非常重要的方面,可以在很大程度上决定一个应用程序的命运。良好的测试可以在早期捕获导致应用程序崩溃的问题,但较差的测试往往总是导致故障和停机。

    单元测试用于测试各个代码组件,并确保代码按照预期的方式工作。单元测试由开发人员编写和执行。大多数情况下,使用JUnit或TestNG之类的测试框架。测试用例通常是在方法级别写入并通过自动化执行。

    单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复、改进或重构之后的正确性。

    2 单元测试用例相关概念 2.1正面测试(Positive Testing) 测试被测对象的正确功能实现无误,即正常流程功能。往往需要根据设计说明进行用例导出,严格按照设计说明编写即可,用例划分注意等价类区分等方法。

    2.2负面测试(Negative Testing) 测试被测对象的异常功能实现无误,多在异常流程,异常数据中体现。该部分测试需要对被测对象进行错误发散,常依赖于边界值区分等方法。

    2.3分支测试 使用流程图,明确可能出现的每条分支,制造响应的数据进行覆盖,实现对被测对象的测试。这个过程对于分支可以进行响应的简化,可以穿插等价类等方法去除同类分支。

    2.4 边界值分析法 这种方法更偏向于黑盒测试用例设计中使用,对被测输入进行边界分析,从各个角度都会有边界值,例如程序内部依赖之间,已经有一些边界存在,在程序集成展示后,也会有新的边界出现,在设计的时候,需要注意这些细节。例如我们可输入范围是3-6,和输入类型为浮点数。那么边界值为7-8之间

    7 8

    | |

    3 单元测试设计原则和任务 3.1 三原则 为了提高开发人员的代码质量,编写高质量的单元测试,要遵守3R(Responsible, Reliable, Repeative)原则,具体含义如下:

    Responsible: 谁开发谁负责测试,在哪里开发就在哪里测试。

    Reliable: 测试case要可靠,并且是值得信赖的,对于底层的任何改动都要能够及时感知。

    Repeative: 所有单元测试用例都要能够重复运行。能够重复运行就能够进行回归测试、覆盖率统计等等。

    3.2 单元测试任务 一般来说,单元测试任务包括:

    1、接口功能测试:用来保证接口功能的正确性。

    2、局部数据结构测试(不常用):用来保证接口中的数据结构是正确的

    (1)比如变量有无初始值

    (2)变量是否溢出

    3、边界条件测试

    (1)变量没有赋值(即为NULL)

    (2)变量是数值(或字符)

    a.主要边界:最小值,最大值,无穷大(对于DOUBLE等)

    b.溢出边界(期望异常或拒绝服务):最小值-1,最大值+1

    c.临近边界:最小值+1,最大值-1

    (3)变量是字符串

    a.引用"字符变量"的边界

    b.空字符串

    c.对字符串长度应用"数值变量"的边界

    (4)变量是集合

    a.空集合

    b.对集合的大小应用"数值变量"的边界

    c.调整次序:升序、降序

    (5)变量有规律

    a.比如对于Math.sqrt,给出n2-1,和n2+1的边界

    4、所有独立执行通路测试:保证每一条代码,每个分支都经过测试

    (1)代码覆盖率

    a.语句覆盖:保证每一个语句都执行到了

    b.判定覆盖(分支覆盖):保证每一个分支都执行到

    c.条件覆盖:保证每一个条件都覆盖到true和false(即if、while中的条件语句)

    d.路径覆盖:保证每一个路径都覆盖到

    (2)相关软件

    a.Cobertura:语句覆盖

    b.Emma: Eclipse插件Eclemma

    5、各条错误处理通路测试:保证每一个异常都经过测试

    4 注意事项 4.1独立性 单元测试用例在设计和数据准备的过程中,需要保持良好的独立性,确保本测试的数据是不需要依赖其他输出的,这样减少相互影响。

    4.2尽量脱离被测代码的束缚 在测试用例设计的过程中,尤其是测试用例编写在代码编写完成后进行的,一定小心被代码实现功能所影响,多考虑异常分支和异常数据。

    4.3面向对象的语言单元测试特点 面向对象的语言进行单元测试还有一定的特点,对于每一个类,可能他出现在程序中的情况各不相同,在进行测试的时候,可以结合上面介绍的方法,根据内部方法相互调用逻辑,完成测试设计。

    大体划分两个方向,一个是功能性的,就是类似黑盒的方法,仅仅关注实现的功能点是否正确;另一个就是结构性测试,需要分析类中的方法相互实现逻辑,进行类似白盒测试,确保每个分支覆盖。

    5 单元测试用例编写技巧 5.1使用断言 使用断言而不是Print语句许多新手开发人员习惯于在每行代码之后编写System.out.println语句来验证代码是否正确执行。这种做法常常扩展到单元测试,从而导致测试代码变得杂乱。除了混乱,这需要开发人员手动干预去验证控制台上打印的输出,以检查测试是否成功运行。更好的方法是使用自动指示测试结果的断言。

    5.2 考虑负面场景 除了正面情景,还要测试负面情景和边缘情况通常,开发人员会花费大量的时间和精力编写测试用例,以确保应用程序按预期工作。然而,测试负面测试用例也很重要。负面测试用例指的是测试系统是否可以处理无效数据的测试用例。

    5.3 测试结果的预知性 构建具有确定性结果的测试,一些方法不具有确定性结果,即该方法的输出不是预先知道的,并且每一次都可以改变,为该方法编写测试用例不会有任何用处。

    原文:https://blog.csdn.net/moshenglv/article/details/79610986 VS中有个非常有用的功能,单元测试。通过单元测试,开发人员和测试人员可以快速的检查C#,.net和c++项目中各个类的方法中是否有逻辑错误。单元测试仅仅需要创建一次,那么在每次更改源代码时候运行,以确保不引入bug。      对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里或C++里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。       https://blog.csdn.net/u013299585/article/details/73662526   经过多方面查找资料,以及询问同学,发现有三种单元测试的方法。下面一一介绍。      第一种方法:   首先创建在你需要测试的解决方案树上创建一个Unit Test Project。   如图所示:      如图所示,创建单元测试项目      这时会自动帮我们创建一个unittest1.cpp并生成部分初始代码      箭头指向的文件,就是需要写单元测试用例代码的地方。

    例如我写的例子   然后可以使用下面的方法对这些单元测试进行运行

    那么将会运行你的所有测试用例。 如果运行成功的话,则会出现Test explore窗口。如下图

    请注意,此处比较关键如果没有设置相关项目,那么会出错的 错误截图如下

    此时说明你没有配置单元测试的外部依赖项,如下图      此外还需要配置单元测试的关联

    选择要关联的单元测试

    完美

    第二种方法:   第二种方法和第一种方法所有的配置都一样,仅仅是单元测试的方式不同,并且单元测试代码的结构也不同。第一种方法创建的是Unit Test Project。而第二种方法,创建的是Managed Test Project,如下图所示。

    该单元测试的代码格式为

    其他配置和用法与第一种方法相同。请参考第一种方法。

    两种方法都可以进行单元测试,但是他们是有差别的。 其实这两个工程都可用来进行单元测试,Managed Test Project提供了更全面的功能,如对类的开始初始化和结束销毁的处理,每个测试方法前后进行初始化和销毁处理等。而Unit Test Project相当于是对Managed Test Project的一种封装,只提供最简单、最常用的测试功能,而帮我们默认处理很多繁琐的工作。

    附:常用的Assert用法 1.3常用的Assert用法 Assert.Inconclusive() 表示一个未验证的测试;

    Assert.AreEqual() 测试指定的值是否相等,如果相等,则测试通过;

    AreSame() 用于验证指定的两个对象变量是指向相同的对象,否则认为是错误

    AreNotSame() 用于验证指定的两个对象变量是指向不同的对象,否则认为是错误

    Assert.IsTrue() 测试指定的条件是否为True,如果为True,则测试通过;

    Assert.IsFalse() 测试指定的条件是否为False,如果为False,则测试通过;

    Assert.IsNull() 测试指定的对象是否为空引用,如果为空,则测试通过;

    Assert.IsNotNull() 测试指定的对象是否为非空,如果不为空,则测试通过;

    对于动态链接库的单元测试 上面的方法 只 能应用在生成.exe的项目,但是如果想测试动态库的情况就需要一些改动。 其他的步骤基本相同,不同的是,在测试单元中不需要配置外部依赖项, 只需要关联你将要测试的项目。

    要做的工作只是正确生成动态链接库 这里大致介绍一下。 一般为了保护自己代码,一般需要额外加一个接口,通过接口来访问你设计类的成员函数,相比原来的项目,多加了三个文件,如下图所示。

    这三个文件就是添加的接口,接口的实现,以及生成动态链接库的设置函数。这三个文件如下所示。

    此外还需要设置一个地方,如下图所示。 否则会报错

    最新回复(0)