所以我已经阅读了官方的JUnit文档,其中包含了大量的例子,但是(和许多事情一样),我已经开始 Eclipse了,我正在编写我的第一个JUnit测试,而且我扼杀了一些基本的设计/概念问题.

所以如果我的WidgetUnitTest正在测试一个名为Widget的目标,我想我需要在整个测试方法中创建相当数量的Widget.我应该在WidgetUnitTest构造函数中或在setUp()方法中构造这些Widget吗?如果使用1比1的小部件来测试方法,或者最好的做法是否尽可能地重复使用小部件?

最后,断言/失败和测试方法之间应该存在多少粒度?纯粹主义者可能会认为,一个测试方法中应该存在一对一的断言,但是根据该范例,如果Widget有一个叫getBuzz()的getter,我将最终得到与getBuzz()的20个不同的测试方法名字喜欢

@Test
public void testGetBuzzWhenFooIsNullAndFizzIsNonNegative() { ... }

而不是一种测试众多场景并承载大量断言的方法:

@Test
public void testGetBuzz() { ... }

感谢来自某些JUnit大师的任何见解!

解决方法

模式

有趣的问题首先 – 我在IDE中配置的最终测试模式:

@Test
public void shouldDoSomethingWhenSomeEventOccurs() throws Exception
{
    //given

    //when

    //then
}

我总是从这个代码开始(聪明人称它为BDD).

在给定的情况下,我将测试设置放在每个测试中是唯一的.
>什么时候是理想的单行 – 你正在测试的东西.
>然后应该包含断言.

我不是一个断言倡导者,但你应该只测试一个行为的单一方面.例如,如果该方法应该返回某些东西,并且还会产生一些副作用,请创建两个相同的测试,同时给出和何时使用.

测试模式也包括抛出异常.这是为了处理Java中烦人的检查异常.如果你测试一些代码,那么你就不会被编译器所困扰.当然,如果测试引发一个异常,它会失败.

建立

测试设置非常重要.一方面,提取常用代码并将其放在setup()/ @ Before方法中是合理的.但是请注意,当读取测试(可读性是单元测试中最大的价值!)时,很容易错过挂起在测试用例开头部分的设置代码.所以相关的测试设置(例如你可以以不同的方式创建窗口小部件)应该去测试方法,但是应该提取基础设施(设置常见的模拟,启动嵌入式测试数据库等).再次提高可读性.

您还知道JUnit每次测试创建了新的测试用例类实例?所以即使你在构造函数中创建了CUT(被测类),每个测试之前调用构造函数.有点恼人

粒度

首先你的测试,并考虑你想要测试的用例或功能,从不考虑:

this is a Foo class having bar() and buzz() methods so I create FooTest with testBar() and testBuzz(). Oh dear,I need to test two execution paths throughout bar() – so let us create testBar1() and testBar2().

shouldTurnOffEngineWhenOutOfFuel()很好,testEngine17()是坏的.

更多关于命名

testGetBuzzWhenFooIsNullAndFizzIsNonNegative名称告诉测试是什么?我知道它测试的东西,但为什么?你不觉得细节太贴心了吗?怎么样:

@Test shouldReturndisabledBuzzWhenFooNotProvidedAndFizzNotNegative`

它以有意义的方式描述输入和您的意图(假设禁用的嗡嗡声是某种蜂鸣状态/类型).还要注意,我们不再为Foo编写getBuzz()方法名称和null合同(而是我们说:当没有提供Foo时).如果将来用null对象模式替换null怎么办?

也不要怕getBuzz()的20种不同的测试方法.而是考虑您正在测试的20种不同用例.但是,如果您的测试用例类增长太大(因为它通常比测试类大得多),则可以将其提取到几个测试用例中.再一次:FooHappyPathTest,FooBogusInput和FooCornerCases都不错,Foo1Test和Foo2Test都不错.

可读性

争取简短和描述性的名字.那时给出的几条线条很少.而已.创建构建器和内部DSL,提取方法,编写自定义匹配器和断言.测试应该比生产代码更加可读.不要过度模拟.

我发现首先编写一系列空的名为好的测试用例方法是有用的.然后我回到第一个.如果我仍然明白我在什么条件下测试什么,我在此期间实施测试构建类API.然后我实现那个API.智能人称它为TDD(见下文).

推荐阅读:

> Growing Object-Oriented Software,Guided by Tests
> Unit Testing in Java: How Tests Drive the Code
> Clean Code: A Handbook of Agile Software Craftsmanship

java – 写第一个JUnit测试的更多相关文章

  1. Xcode C开发,需要澄清

    我非常喜欢Xcode提供对该语言可能的成员函数的深入了解的方式,并且更喜欢相对于文本伙伴使用它,如果不是因为我今天注意到的奇怪.当strings=“Teststring”时;唯一可用的substr签名如图所示但据我所知,签名应该是什么iseeonline确实s.substr(1,2);既被理解也适用于Xcode.当我尝试方法完成时为什么不显示?

  2. xamarin.ios – 没有找到ViewController ::.ctor(System.IntPtr)的构造函数

    我有一个问题,我的Monotouch应用程序有时在收到内存警告后才会崩溃.请参见下面的堆栈跟踪.堆栈跟踪是正确的,因为指定的类缺少构造函数获取IntPtr参数.但是这是有意的,因为我在应用程序中根本不使用InterfaceBuilder.那为什么会这样呢?

  3. ios – Swift – NSURL错误

    尝试使用下面的NSURL类时出错,下面的代码实际上是试图将我从Facebook拉入的图像存储到imageView中.错误如下:不知道为什么会这样,帮忙!解决方法你正在调用的NSURL构造函数有这个签名:?表示构造函数可能不返回值,因此它被视为可选.NSData构造函数也是如此:快速解决方法是:最好的解决方案是检查(解包)这些选项,即使您确定它们包含值!

  4. 如何在Xcode中追踪“libc abi.dylib:纯虚函数!”

    我有一个多线程OSX应用程序,它使用C,Objective-C和Swift的混合.当我的应用程序关闭时,我在Xcode调试器窗口中看到了这一点:我知道这个错误通常是由对C类构造函数或析构函数中的虚函数的调用引起的.有没有一种简单的方法可以找到它的位置?

  5. Swift实现对象归档

    Swift实现对象归档时有几个注意点要继承NSCoding,实现两个方法extension是一个分类,分类不允许有存储能力,所以协议方法不能写在分类中协议中的init(coderdecoder:NSCoder)函数会覆盖原始的构造函数,所以类中至少还要有另一个init方法如果不指定键名,会使用属性名称作为key,基本数据类型,需要指定key

  6. 【Swift初见】Swift构造过程

    构造过程是通过构造器来实现的,其实每个构造器就可以看作是一个函数,只是这个函数是为了执行初始化的。每个类都必须拥有一个指定构造器。

  7. swift的struct结构体类型介绍使用

  8. swift struct

    //:Playground-noun:aplacewherepeoplecanplayimportCocoavarstr="Hello,playground"structpoint{varx=0;vary=init(x:Int,y:Int){self.x=x;y=y;println("init");}funcgetCenter()->Int{return(x+y)/2;}mutatingfunca

  9. 《The Swift Programming Language》2.0版之自动引用计数

    Swift1.0文档翻译:TimothyYeSwift1.0文档校对:HawsteinSwift2.0文档校对及翻译润色:ChannePS:之前1.0版中文版看不懂地方在对比英文版后就懂了,还是之前翻译的不够准确啊。,而不是Person),它们的值会被自动初始化为nil,目前还不会引用到Person类的实例。由于Person类的新实例被赋值给了reference1变量,所以reference1到Person类的新实例之间建立了一个强引用。在你将john和number73赋值为nil后,强引用关系如下图:P

  10. swift #6 类

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部