我很难理解如何在我所有字段均为私有的类中实施单元测试。
该类正在使用BLE和CoreLocation计算用户的位置-不那么重要。我有一个协议,当找到一个新位置时,我会调用它,所有符合该协议的类都将收到房间ID和房间名称。那么,这意味着我的类中的所有字段实际上都是私有的,因为是的,没有理由让任何外部类都应该正确地访问它们吗?但这也意味着即使要测试很多功能,我也不能在该类中进行任何测试。我的意思是,我可以将变量设置为内部变量而不是私有变量,但是仅对单元测试这样做似乎是错误的。我听说过依赖注入,但是似乎付出了很多努力。
例如,我具有以下功能:
private var beacons: [AppBeacon] = []
private var serverBeacons:[Beacon] = []
private func addBeacons(serverBeacons: [Beacon]){
for beacon in serverBeacons {
let beacon = AppBeacon(id: beacon.id, uuid: beacon.uuid, building: beacon.building, name: beacon.name)
beacons.append(beacon)
}
}
例如,我无法测试信标阵列是否确实被填满。该类的公共功能基本上是一个名为startLocating的函数,其结果是房间的ID和名称,我在黑盒测试中知道哪个单元测试模仿了(对吗?),我不必在意中间步骤,但说实话,我只想说这么多功能,没关系吗?并假设我确实用我选择的一些rssi值填充了信标,实际的位置算法是在node.js服务器上执行的,所以老实说我不知道要测试客户端什么?
这是经典的MVC,在截止日期之前,我无法更改其体系结构,所以我不知道从这里走的最佳方法是什么?只是不测试功能?将字段设置为内部字段而不是私有字段?我们在服务器端进行了算法本身的测试,因此已经测试了房间ID是否为预期的房间ID。
我在另一篇文章中读到以下内容:
“按定义,单元测试是黑盒测试,这意味着您并不关心所测试单元的内部。您主要希望根据输入的内容来查看单元输出是什么单元测试。 现在,通过输出,我们可以对以下几项进行断言:
在所有情况下,我们只对公共接口感兴趣,因为它是与世界其他地方进行通信的接口。 私有的东西不需要仅仅因为任何私有的东西被公共的间接使用而进行单元测试。诀窍是编写足够多的测试以锻炼公共成员,以便完全覆盖私人成员。
此外,要记住的一件事是,单元测试应验证单元规格,而不是其实现。验证实现细节会增加单元测试代码和被测试代码之间的紧密耦合,这有一个很大的缺点:如果被测试的实现细节发生变化,那么很可能也需要改变单元测试,这降低了获得测试的好处该代码段的单元测试。”
从那开始,我从本质上理解它,因为我不应该对此进行单元测试?
答案 0 :(得分:0)
首先,您引用的“单元测试”的定义非常不寻常:据我所知,文献中的所有定义都考虑对玻璃盒/白盒测试方法进行单元测试。更准确地说,这样的单元测试实际上既不是黑盒也不是白盒-用来设计测试用例的方法才有所不同。但是没有理由不将白盒测试设计技术应用于单元测试。实际上,某些白盒测试设计技术仅在应用于单元测试时才有意义。例如,当您研究单元测试时,您会遇到许多关于不同代码覆盖率标准的讨论,例如语句覆盖率,分支覆盖率,条件覆盖率,MC / DC-所有这些对于了解实现至关重要代码的细节,并在测试用例设计期间考虑这些实现细节。
但是,即使考虑到这一点,它也不会因您的特定情况而改变:代码中的变量仍然是私有的:-)但是,您以一种过于严格的方式来应对测试问题:您尝试进行测试功能addBeacons
本身,甚至与该组件中的其他功能完全隔离。
要测试addBeacons
,您的测试用例不仅应包含对addBeacons
的调用,还应包含其他一些函数调用,如果调用addBeacons
,则结果将显示给您是成功的。例如,如果您还具有按名称或位置查找信标的功能,则应首先调用addBeacon
,并检查是否成功,请调用以下功能之一以查看是否可以找到添加的信标。这两个调用将成为同一测试用例的一部分。
答案 1 :(得分:0)
如果您有一个private var
可以帮助您编写单元测试,请将其更改为private(set) var
,以便可以读取(但不能更改)。
揭露内脏可能会打扰您。如果是这样,则可能还有另一种类型正在等待从视图控制器中提取出来。