junit测试设置不回滚

寻找好名字是手工软件的挑战之一。 您需要随时随地找到它们-类,方法,变量,仅举几例。 但是,什么使名字成为好名字呢? 引用Oncle Bob的话:“三件事:可读性,可读性和可读性!” 他后来通过表达的清晰,简单和密度1对其进行了定义

尽管这对我来说很有意义,但我发现自己尤其在测试方法方面有些挣扎。 为了更好地理解我在说什么,需要知道我编写了代码测试驱动程序 。 做了一段时间之后,我逐渐将工作重点从被测单元转移到了测试本身。 这可能是因为我喜欢将一个测试用例视为一项有效的规范和质量保证,因此它非常重要2

因此,只要测试失败,理想情况下,我就能一眼就能知道哪个规范被破坏以及为什么。 实现此目的的最佳方法似乎是找到一个表达性的测试名称,因为这是报告视图中显示的第一条信息:

从这个角度来看,我并不总是对这种观点所显示的内容感到满意,因此我花了一些时间进行研究,以了解哪些思想流派可能会有所帮助。 不幸的是,我发现的大多数结果都有些过时,并且-不足为奇-关于该主题的意见分歧。 这篇文章基于这些发现和一些个人经验,代表了我的看法。

根据方法或行为测试名称进行测试?

每种方法的测试形式通常都是由工具提供的,例如,在事后生成单个测试存根。 如果您的Foo类带有方法bar则生成的方法将称为testBar 。 我一直对这种开发风格或命名约定的有用性持怀疑态度,并且会像旧的JavaRanch线程中的引用一样争论:“您根本不应该将其视为测试方法,而应该将其视为测试行为。班上的 因此,我喜欢我的测试方法名称来传达预期的行为3

有趣的是,我将对那一点改变看法。 如上所述,传达“行为”的想法要求找到一个简明的名称来全面表达该“行为”。 但是随后,术语行为意味着通过一个动作从一个状态过渡到另一种状态,或者用BDD术语表示,例如“当下即给”模式。 老实说,我认为将所有这些信息放在一个单一的名字中通常不是一个好主意4

@Test
public voidgivenIsVisibleAndEnabledWhenClickThenListenerIsNotified() {}
@Test
public voidgivenIsVisibleAndNotEnabledWhenClickThenListenerIsNotNotified() {}
@Test
public voidgivenIsNotVisibleAndEnabledWhenClickThenListenerIsNotNotified() {}

也许这只是口味的问题,但是根据我的经验,由于无论选择哪种格式样式,都缺乏简单性和/或清晰度,因此这种方法通常缺乏可读性。 此外,这样的重载名称往往与注释具有相同的问题–随着内容的发展,这些名称很容易过时。 因此,我想改用BUILD-OPERATE-CHECK 5模式。 这将允许将阶段拆分为单独的子方法名称,并将其放置在单个测试中:

@Test
public void testNameHasStillToBeFound() {// do what is needed to match preconditiongivenIsVisibleAndEnabled();// execute the transitionwhenClick();// verify the expected outcomethenListenerIsNotified();
}

不幸的是,这导致我们进入了起点。 但是,如果仔细看一下上面的示例,所有方法都围绕着一个共同的分母。 它们都属于触发转换的同一动作。 在我们的例子中,点击事件。 考虑到从开发过程的角度来看,我认为一个测试用例比被测单元更重要,因此可以将其解释为一种符号,以在开发中的单元中以适当的方法名称来反映操作6

因此,出于示例的考虑,假设我们有一个环绕UI控件的ClickAction 。 鉴于上述情况,引入一种名为ClickAction#execute()的方法对我们来说似乎很合适。 为简单起见,我们也可以将该名称也用于表示从ClickAction的默认状态到通过ClickAction#execute()控件构造的转换的测试方法:

class ClickActionTest {@Testpublic void execute() {Control control = mock( Control.class );ClickAction clickAction = new ClickAction( control );clickAction.execute();verify( control ).notifyListeners(...)}
}

为了简单起见,下一个测试名称可能只提及重要的状态信息,因为它不同于默认值并导致另一个结果:

class ClickActionTest {[...]@Testpublic void executeOnDisabledControl() {Control control = mock( Control.class );when( control.isEnabled() ).thenReturn( false );ClickAction clickAction = new ClickAction( control );clickAction.execute();verify( control, never() ).notifyListeners(...)}@Testpublic void executeOnInvisibleControl() {[...]
}

如您所见,这种方法产生了一组测试名称,从技术上讲,它们代表各种“每种方法的测试”模式-但并非出于我认为完全出于不利的原因。 考虑到上下文,我认为这种命名模式很简单,清晰并且具有表达力:

仍未提及预期的测试结果。 乍一看,这似乎并不令人满意,但是从我目前的观点来看,我愿意接受这是一个合理的权衡。 特别是,通常在JUnit报告视图中也会显示测试失败的原因。 因此,可以通过提供有意义的测试失败7来解决该问题。

结论

实际上,我现在正在使用上述测试命名模式一段时间。 到目前为止,效果还不错。 特别是在像我通常使用的非常小的单元上工作时,几乎没有错误解释的空间。 但是,这种方法并不适合所有情况,有时感觉只是更好,而且可读性足以提及结果。 我不会在这里谈论原则,也许我弄错了。 因此,我很高兴能为您提供一些指向更详尽的方法的指针,您可能会意识到这些方法可以扩大我的观点。

  1. Robert C. Martin关于清洁测试,清洁代码,第9章单元测试↩
  2. 更糟的是:丢失被测单元或测试用例? 有了良好的测试用例,恢复单元在大多数情况下应该很容易,但是反之亦然,您很容易错过丢失的测试用例中指定的其中一个极端用例↩
  3. 使用JUnit的方法的命名约定,使用JUnit的方法的命名约定 ↩
  4. 为避免误解: BDD的功能与众不同,并带有自己的测试框架。 我只是在这里提到它,因为术语“行为”似乎暗示了这一点,而术语“ givenWhenThen”在有关测试名称的许多讨论中不胜枚举。 然而,你居然发现像罗伊Osherove的命名约定标记建议“UnitOfWork_StateUnderTest_ExpectedBehavior”这似乎仍然被广泛接受虽然帖子已经看到大多数的最后十年的日子↩
  5. Robert C. Martin,《清洁规范》,第9章,清洁测试↩
  6. 甚至将全部功能提取到一个单独的类中。 但是,这种情况下,在我的岗位描述更具有MoreUnit单位 ↩
  7. 这可能是一个主题,当我不得不结束时,我就这样保留它! ↩

翻译自: https://www.javacodegeeks.com/2014/03/getting-junit-test-names-right.html

junit测试设置不回滚

junit测试设置不回滚_正确设置JUnit测试名称相关推荐

  1. mysql 事务回滚_简短截说阐述redis中事务的使用

    我们知道,在关系型数据库中,比如mysql,如果要使用事务,首先向数据库服务器发送 BEGIN ,然后执行各个相互一致的写操作和读操作,最后,用户可以选择发送 COMMIT 来确认之前所做的修改,或者 ...

  2. 前阿里 P9 级员工称离婚是模拟测试,已回滚复婚!

    平常程序员会讨论"发布回滚"."代码回滚"."数据库回滚"这些Rollback操作,可以下这位资深程序员居然将"回滚"用 ...

  3. dubbo调用超时回滚_微服务痛点基于Dubbo + Seata的分布式事务(AT模式)

    前言 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案. ...

  4. git 代码回滚_谁说用 Git 一定要用命令行?试试 SourceTree 吧

    作者:邵磊http://juejin.im/post/59bc944d51882519777c5e07 整理:后端技术精选 前言 作为使用Sourcetree大于3年的我,已熟知git的每一个功能,并 ...

  5. mysql8.0数据回滚_大企业数据库服务首选!AliSQL这几大企业级功能你不可不知

    MySQL代表了开源数据库的快速发展,从2004年前后的Wiki.WordPress等轻量级Web 2.0应用起步,到2010年阿里巴巴在电商及支付场景大规模使用MySQL数据库,再到2012年开始阿 ...

  6. 奇葩!前阿里 P9 级员工称离婚是模拟测试,已回滚复婚!

    作者 | 伍杏玲 出品 | 程序人生(ID:coder_life) 平常程序员会讨论"发布回滚"."代码回滚"."数据库回滚"这些Rollb ...

  7. 编写测试代码事物回滚案例

    编写测试代码 .加入相关注解 @RunWith(SpringJUnit4ClassRunner.class) //表示使用的测试工具版本 @ContextConfiguration("cla ...

  8. springboot 事务手动回滚_来,讲讲Spring事务有哪些坑?

    来自公众号:孤独烟 引言 今天,我们接上文<面试官:谈谈你对mysql事务的认识>的内容,来讲spring中和事务有关的考题! 因为事务这块,面试的出现几率很高.而大家工作中CRUD的比较 ...

  9. java 自定义异常 未回滚_抛出自定义异常,spring AOP事务不回滚的解决方案

    spring AOP 默认对RuntimeException()异常或是其子类进行事务回滚,也就是说 事务回滚:throw new RuntimeException("xxxxxxxxxxx ...

最新文章

  1. 你说你懂互联网,那这些你知道么?
  2. 2004年c语言试题2,C语言试题(2004~2005第2学期)A重修
  3. linux打开应用程序的命令,Windows环境下如何通过命令打开程序!
  4. mysql三台机群集_MySQL Cluster 3台机器搭建集群环境
  5. S/4HANA Adapt UI按钮的实现逻辑
  6. Spring DI(依赖注入)Xml篇
  7. 华为波兰销售总监被捕;苹果将推三款新 iPhone;ofo 用冻结款还债 | 极客头条...
  8. 【CCCC】L2-022 重排链表 (25分),,链表遍历
  9. 噪声、白噪声、高斯噪声、高斯白噪声以及加性和乘性噪声
  10. 小甲鱼python课后题共多少讲_小甲鱼python视频第七讲(课后习题)
  11. mysql的auto_increment报错1467
  12. Unity3d C#解决transform.LookAt朝向前后翻转问题(含源码)
  13. Springboot 服务端为App集成支付宝支付
  14. python中模拟浏览器抓取网页(-)
  15. CSS3选择器(全)
  16. PTA 6-9 递归计算P函数 (10分)
  17. HTTP协议之vary
  18. odbc找不到服务器ip,[转载]不需ODBC可由IP地址与端口号建立与SQLSERVER的连接
  19. Codefoece Educational Codeforces Round 83 (Rated for Div. 2)题解,(ABCDE)
  20. Python:1018 锤子剪刀布

热门文章

  1. 【动态规划】农田个数 (ssl 1633)
  2. 面试阿里挂了却拿到网易、点我达offer,一个三年经验Java程序员的面试总结
  3. 大数据Big Data
  4. 这些排序算法的使用时机,你都知道吗?
  5. Vue.js2.0开发环境搭建(一)
  6. Jsoup代码解读之二-DOM相关对象
  7. Promise解决异步操作问题
  8. 《白鹿原》金句摘抄(四)
  9. ssm使用全注解实现增删改查案例——applicationContext-servlet.xml
  10. 交换两个数字的三种方式