iOS:针对Sqlite的单元测试

3

请帮我回答这个问题:我是否应该为与iOS应用程序的本地SQLite数据库交互的数据访问编写单元测试。如果应该,我该如何编写它们?使用模拟数据还是使用db文件。


你为什么想要使用SQLite?苹果对于iOS中原始的SQLite的最后官方支持是在iOS 2中;相反,你应该使用CoreDataplist或任何可序列化的对象。 - holex
2个回答

0
过去,我是通过为每个测试用例创建一个新的SQLite DB文件来完成这项工作的。在测试用例中,我会测试我的代码是否将数据写入了DB,并读取了与写入的完全相同的内容。这样,所有的测试数据都在代码中,因此测试用例更加清晰。
这种方法虽然牺牲了速度,但我的单元测试仍然运行得非常快。

0

假设您想要测试程序的逻辑而不仅仅是访问SQLite的能力,那么使用测试替身(mock对象或虚拟对象)将使您的测试比单独的数据库文件更容易维护。单独的数据库文件必须在正确的行中有正确的数据,如果您在一个测试中进行修改,则必须在下一个测试之前重置它。如果您的测试数据失步了,您的测试将开始失败。具有文本测试值的Mock对象将永远不会出现失步。

使用模拟对象将强制您使用依赖注入,以便您可以将其替换为实际数据对象。使用数据库文件将不会强制您使用依赖注入。因此,如果您正在处理许多不遵循DI模式的现有代码,则数据库文件将是“简单”的选择,虽然从面向对象的角度来看并非最佳选择。


你可以很容易地提供一个“罐装”的数据库(如果您愿意,可以在桌面上构建),并将其反复复制到“实时”数据库位置以重置下一次测试。这比“模拟”对象更加真实。 - Hot Licks
@HotLicks,这种方法会掩盖单元测试的意图,因为他需要一个外部工具来编辑.pdb文件。他不能直接查看他的测试代码并直接看到值。这不可读。请记住,在此时此刻,他不需要测试.pdb文件,而是需要测试模块的逻辑。单独使用.pdb文件是系统测试的好方法,但对于单元测试来说并不是那么好。 - John Deters
我想说,各有所好。但是使用真实数据库进行测试会更加严谨(因为它的响应方式与真实数据库相同),而且速度更快,这样测试人员就不会只做十个变化了。 - Hot Licks
@HotLicks,这是进行强大的特性测试、行为测试、系统测试和/或集成测试的好方法。使用测试文件进行这些活动没有任何问题。但问题是关于单元测试的。而单元测试是关于逐个白盒测试一个特定模块的逻辑,而不是一次性测试整个程序功能。 - John Deters
但是,如果您必须将每个响应编程到您的“模拟对象”中,则有强烈的动机仅执行少量变化,跳过边界条件等(忽略此类激励会带来巨大风险)。使用测试数据库很容易为20-30-100个不同的变体加载数据。您还知道数据库将准确响应。唯一可能值得使用“模拟对象”的情况是模拟错误条件 - 数据库被锁定、数据库离线/未找到等。 - Hot Licks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接