【问题标题】:Is it good to write input in @Before function for JUnit tests? [closed]在 @Before 函数中为 JUnit 测试编写输入是否很好? [关闭]
【发布时间】:2020-07-30 08:53:37
【问题描述】:

我对为 Android 编写单元测试还是很陌生。我有两个问题:

  1. 在 JUnit 的 @Before 函数中为所有测试编写公共输入是否合适?
  2. 在单个单元测试中编写两组断言是否是一种好习惯,我的意思是我断言一些东西,然后我做一些操作,然后我再次做断言?

参考代码:

@ExperimentalCoroutinesApi
@RunWith(AndroidJUnit4::class)
@SmallTest
class TicketDaoTest {
    @get:Rule
    val instantExecutorRule = InstantTaskExecutorRule()
    private lateinit var database: PickDatabase
    private lateinit var ticket: Ticket
    private var timeStamp = System.currentTimeMillis()

    @Before
    fun initSetup() = runBlockingTest {
        timeStamp = currentTime
        ticket = Ticket(
            "purchaseId", 1, "originName", 1,
            "destName", timeStamp, 1, "Cash", 2,
            44.0, isCancelled = false, synced = false
        )
        database = Room.inMemoryDatabaseBuilder(
            ApplicationProvider.getApplicationContext(),
            PickDatabase::class.java
        ).build()
        database.ticketDao().insert(ticket)
    }

    @After
    fun closeDb() = database.close()

    @Test
    fun testGetRecentTickets_returnSingleTicketListBeforeTimeout() = runBlockingTest {
        val tickets = database.ticketDao().getRecentTickets(timeStamp)
        assertThat(tickets, hasSize(1))
        assertThat(tickets, hasItem(ticket))
    }

    @Test
    fun testSetSynced_returnsEmptyList() = runBlockingTest {
        var tickets = database.ticketDao().getUnSyncedTickets()
        assertThat(tickets, hasSize(1))
        assertThat(tickets, hasItem(ticket))
        database.ticketDao().setSynced(listOf(ticket.purchaseId))
        tickets = database.ticketDao().getUnSyncedTickets()
        assertThat(tickets, empty())
   } 

    @Test
    fun testRemoveTicketFromDatabase_returnsEmptyList() = runBlockingTest {
        var tickets = database.ticketDao().getRecentTickets(timeStamp)
        assertThat(tickets, hasSize(1))
        database.ticketDao().removeTicketFromDatabase(ticket.purchaseId)
        tickets = database.ticketDao().getRecentTickets(timeStamp)
        assertThat(tickets, empty())
    }
}

【问题讨论】:

  • 对此没有真正的正确或错误答案,这取决于团队的意见和标准

标签: android unit-testing junit junit4


【解决方案1】:

没有关于如何编写单元测试的通用规则。

但是,从长远来看,有一些建议和最佳做法可以帮助您。

这些建议因人而异,但它们都有这些规则的一些变化。

  1. 在隔离中一次测试一件事 - 这基本上意味着测试不应该相互依赖,每个测试都应该独立存在。一项测试不应被另一项更改。您可以忽略在@Before 中运行设置意味着一个测试无法修改另一个测试的数据。但我看到你正在那里创建内存数据库。这可能会很慢,如果你有数百个这样的测试可能需要一段时间,所以最好的方法可能是在 @BeforeClass 中创建数据库,然后在 @After 中重置数据。

  2. AAA 规则:排列、动作、断言 - 测试应从准备数据的排列部分开始,然后是执行操作的动作部分,最后是执行断言的断言部分。你基本上是在做安排、行动、资产、行动、断言。在某些情况下这可能很好,但通常我会尽量避免它并坚持 AAA 结构。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多