Tag: 质量软件

更好的Swift测试设置

在编写测试时,我们必须以良好的代码和质量来进行测试,使其变得更加干净,简单和快速,对吗? 但是有时候很难做到。 我们开始在测试中看到一些可重复的代码,设置和期望值。 今天,我将向您展示提示/技巧 ,以在没有框架的情况下为您的测试创建可重用,更简洁的设置。 让我们开始展示一个使用swift默认测试库的示例。 XCTest。 初试班 该类将以不同的方式测试UserRepo存储库类中名为findAdminsBy的函数。 上面的测试代码易于理解和重用,对吗? 具有一些帮助程序功能,安装程序在每次测试之前运行并重用变量。 是的,很简单并且可重用。 但是,让我们列出一些“问题”: 我们只测试UserRepo的一个功能,即findAdminsBy : –如果要测试UserRepo的另一个功能将增加一些复杂性; –要测试另一个功能,我们需要更改setUp功能或将其删除并将其放入期望功能中。 什么不好,因为这将是一个冗长的考验; 需要更改默认设置时,作为第一个功能测试。 在期望函数内添加了一个设置; 每个期望函数都在调用可重复代码: result = userRepo.findAdminsBy(email: email) 如有必要,添加新参数,我们需要在所有期望函数中进行更改。 那么,我们如何才能为上面的列表改进并创建一些解决方案? 我们将使用闭包概念用作设置并执行可重用的动作。 为了更好地了解闭包 ,这里是官方文档。 首先,我们需要创建两件事来帮助我们的测试。 #1 —动作结构 该Struct将有助于保持关闭状态直到被调用为止。 在闭包内部,将包含您需要保留的操作。 例如: result = userRepo.findAdminsBy(email: email) 。 用法将在稍后显示。 #2 —执行功能 该功能将有助于通过一些设置配置来运行/执行操作 。 波纹管是Executer.swift文件: 第二级考试-重构 现在,让我们使用这两个助手实现一个新的Test类。 我们可以看到的第一件事是操作和设置特定于findAdminsBy函数。 如果我们需要测试UserRepo的其他功能,只需使用自己的设置添加其他操作。 该代码现在更加灵活,可重用和更简洁。 该测试继续简单易懂。 如果您像我一样参加BDD测试,那么我将向您介绍测试框架Quick。 这将帮助您以BDD样式进行测试。 […]

使用Xcode 9工具查找运行时错误

可能的情况 1 –数据竞赛 在多个线程之间共享的任何可变数据都需要访问同步。 如果在共享的可变变量上缺少同步 ,则意味着您存在数据竞争。 在存在数据争用的情况下,我们的程序可能会发生内存损坏和崩溃。 这些问题适用于C语言,也适用于Swift代码。 因此,让我们看一下Swift中的示例。 在这种情况下,我们有一个名为EventLog的类,它仅具有一个简单的名为log的函数,该函数将一些文本消息输出到输出中。 但是它也跟踪哪个是调用该log方法的最后一个事件源。 它将信息保存到一个名为lastEventSource的存储属性中,该属性是一个可选变量,在开始时为nil,但是一旦有人调用log,就会使用该特定日志源完美填充该信息。 现在让我们说我们有两个线程都试图同时调用该log方法。 假设第一个线程是我们的网络子系统,并且记录了一些下载已完成。 当第二个线程(代表我们的数据库子系统)正在记录查询已完成时: 那是一场数据竞赛,因为我们正在同时访问相同的内存位置。 Thread Sanitizer将对此发出警告! 要解决此问题,我们需要引入同步,最简单的方法是使用串行调度队列。 现在,由于此队列是串行的,因此一次只能执行一个工作项。 因此,如果将log函数的主体包装到queue.async中,将提供正确的同步。 并请注意,我在这里使用async是因为我们不需要等待该函数完成,因为该函数不会提供任何结果,因此等待它是没有意义的。 因此,这不仅解决了该问题,而且还提高了性能,因为现在无论呼叫日志的人都不再需要等待此打印完成。 这样,整个类现在都是线程安全的,我们可以从多个线程调用log 。 由Grand Central Dispatch或GCD提供的Dispatch队列在Swift中很容易获得,它们应该是同步的首选。 即使还有其他提供同步的机制,GCD也非常轻巧,并且可以从Swift轻松使用。 提示:一个好主意是将数据与串行调度队列相关联,并且仅访问这些队列中的数据,这将确保您仅以同步方式使用数据。