我应该首先为视图层编写测试(遵循 TDD),还是只进行手动测试并在完成后添加快照测试?

Iva*_*nov 2 tdd uiviewcontroller uiview ios swift

正如预期的那样,在使用视图层遵循 TDD(即首先编写测试)时,我通常会遇到困难。

也就是说,为了观察或触发某些可见的更改(布局或样式),我需要公开视图的内部结构。这打破了封装并允许客户端代码执行诸如myView.label.text = "User".

为了避免这种情况,我要么向UIView类添加 getter 方法:

var userName: String{ return label.text }
Run Code Online (Sandbox Code Playgroud)

或者做一些仅添加到测试框架的扩展:

extension MyView{

//avoids making a getter just for the sake of testing, while keeping it private and interchangeable
var userName : String{
   return (viewWithTag(someLabelTage) as! UILabel).text
} 
Run Code Online (Sandbox Code Playgroud)

另一种方法是跳过 TDD 工作流程(即功能完成后手动测试)并添加快照测试(请参阅https://github.com/pointfreeco/swift-snapshot-testing)以增加覆盖率并具有安全性重构时.net。

考虑到这一切,我想知道是否有任何其他模式或方法可以用来提高效率,同时保持对代码的信心。

Spo*_*ock 5

我不是 Swift 专家,但无论哪种语言/框架,有些事情告诉我你实际上让你的任务变得更加困难。

在使用视图层遵循 TDD 时,我通常会遇到困难。

这是预料之中的。视图支持很简单并且根本没有行为(即域逻辑)。它应该是简单的用户交互,并将数据绑定到视图中的控件。因此,在我看来,您不需要 TDD 或者围绕视图进行更精确的单元测试。尝试为视图编写单元测试不会获得太多价值。

可以使用 UI 测试框架(例如 Selenium)或您自己的 UI 测试框架(用于测试用户交互)更有效地测试您的视图。这样,与尝试对视图层进行 TDD 相比,您可以获得更多的投资回报 (ROI)。

  • 仔细阅读后,由于强调投资回报率,我将其标记为已接受。我认为重点应该真正放在从测试中获得最大价值,而不是为了遵循某些开发规则而编写测试(但是我非常喜欢它)。 (2认同)