[Day 21] 测试的型态调整,谈单元测试与整合测试

我们测试过了几个案例,像是 测试更新标签时如过滤Admin,结果应不出现Admin测试更新标签时如过滤Admin和Author,结果应不出现Admin和Author

不过,我们会发现到,我们不太可能去撰写 removeTag()所有的组合出来,然後每组都加上测试。这样既大量增加测试案例的数量,又导致测试很难维护。

这时,我们导入另一个观念:整合测试和单元测试。

什麽是整合测试

简单的说,整合测试就是我们之前所做的 测试更新标签时如过滤Admin和Author,结果应不出现Admin和Author 这类测试。

要能成功执行这段测试,我们需要 removeTag()updateUsersTags() 两个函数进行互动,才能通过这个测试案例。

实务上根据程序码的调整,随着程序逐渐拆细,满足一个功能所需的互动元件越来越多,会有很多的案例属於这种情况。

整合测试可以实际的呈现满足这段需求时,各个元件互动是否正确,是非常重要的一种测试方式。

但是,随着元件越来越多,我们不太可能将所有元件互动的可能都列举出测试案例。这时候我们可能会开始构思,是否该测试单一的元件就好。

这时候,我们就可以引入单元测试的概念了。

单元测试

单元测试,也就是我们测试的对象,从一堆元件之间互动所满足的功能,变成了针对单一个元件的功能所进行的测试。

以目前这些程序来说,我们最小的元件单位,也就是函数们。更具体来说,就是 updateUsersTags()removeTag()

不考虑组合出来的功能,而是单看这些元件的话,其实 removeTag() 要满足的是给他一堆 tag,能够移除不要的 tagupdateUsersTags() 则是要更新 tag 并执行 filter 参数内的内容。

所以,我们来写第一个单元测试吧!

removeTag() 的单元测试

首先,我们先建立 tests/kotlin/RemoveTagKtTest.kt

针对 removeTag() 我们测试看看以下几个案例:

  • 能正确移除标签,不移除多余标签
  • 能正确处理移除标签不存在的状况
  • 能正确处理无标签传入的状况

我们来写看看 能正确移除标签,不移除多余标签()

@Test
fun `能正确移除标签,不移除多余标签`() {
	initDatabase()
	transaction {
		val testTags = makeTestTags(2)
		testTags[0].name = "Admin"
		val filteredTag = testTags.removeTag("Admin")
		Assert.assertThat(filteredTag, not(hasItem(testTags[0])))
		Assert.assertThat(filteredTag, hasItem(testTags[1]))
	}
}

这边我们一样利用 initDatabase()makeTestTags() 协助我们建立测试环境。

通过测试之後,这个测试情境我们就通过了。

能正确处理移除标签不存在的状况()

@Test
fun `能正确处理移除标签不存在的状况`() {
	initDatabase()
	transaction {
		val testTags = makeTestTags(2)
		val filteredTag = testTags.removeTag("Admin")
		Assert.assertThat(filteredTag, `is`(testTags))
	}
}

这段逻辑很简单,应该不会有什麽难以理解的部分。

最後,我们来写看看 能正确处理无标签传入的状况()

@Test
fun `能正确处理无标签传入的状况`() {
	initDatabase()
	transaction {
		val testTags = makeTestTags(0)
		val filteredTag = testTags.removeTag("Admin")
		Assert.assertThat(filteredTag, `is`(makeTestTags(0)))
	}
}

撰写之後执行看看,如果顺利的话,这段测试应该也能正常通过。

这样,针对 removeTag() 的三个情境,我们就都成功的测试过了!


<<:  D25: 工程师太师了: 第13话

>>:  [Day 17] 实作 - 介面篇

[DAY2]SQL新手的懒人笔记

接续上一次的内容,今天一样会用较为简单的叙述去介绍与分享SQL的简易语法与函数。(大写为内建语法) ...

【Day8】 Introduction – while & for

紧接着,我们就要来介绍 while、for 回圈啦!但是在介绍之前,要先提到一些基本但常用的运算子。...

JavaScript入门 Day05_资料型态

今天要讲的是 施完咒语後,要装的内容物,而这个内容物可以有很多种模样 就是所谓的资料型态 而今天要讲...

33岁转职者的前端笔记 DAY 4 固定浮动选单 RWD 写法

随着智慧型手机的普及 网页设计也要随着时代的潮流而写出适合智慧型手机用户的网页 今天的笔记是目前最常...

day18_Windows ARM 的音乐之旅

音乐播放器 虽然 Mac Os , Linux, Windows 都内建了音乐播放器,但他们仍有一些...