关于iphone:Xcode单元测试

Xcode unit testing

我从未使用过单元测试,我了解它的用途,但我不知道何时以及如何使用它。

我想知道什么时候使用单元测试才是值得的,也许还有一些例子。


其他的答案告诉我什么时候,但不是怎么回答,所以让我也加一个答案。

什么时候?

每当您编写要保存的生产代码时,都应该对其进行单元测试。我在这方面看到的最有用的培训是以下两部分的视频系列:

  • 了解测试驱动开发(第1部分)
  • Roy Osherove的单元测试最佳实践(第2部分)

前五分钟左右只是介绍,所以你可以跳到最后。

怎么

我正在使用Xcode 7和Swift。

启动新项目并添加单元测试。

我叫我的MyProject。如果在项目导航器中打开myprojecttests组,您将看到xcode已经为您创建了一个名为myprojecttest.swift的单元测试文件。

enter image description here

您现在可以删除所有示例方法,并添加一个新的func来测试您自己的类方法。请务必在顶部添加行@testable import MyProject。如果项目名称中有空格,则用下划线替换空格。(例如,"我的示例项目"将使用@testable import My_Example_Project)。

我遵循的是testMethodNameBeingTested_Senario_ExpectedBehavior的命名模式。单元测试名称必须以"test"开头。

我会这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import XCTest
@testable import MyProject

class MyProjectTests: XCTestCase {

    func testSum_TwoNumbers_ReturnsSum() {
        // Arrange (set up the needed objects)
        let myClass = MyClass()

        // Act (run the method you want to test)
        let sum = myClass.sum(1, 2)

        // Assert (test that the behavior is as expected)
        XCTAssertEqual(sum, 3)

    }
}

当然,构建失败,因为我们还没有添加MyClass类。

添加你的类。

我正在向MyProject添加一个称为MyClass的swift文件。

1
2
3
4
5
6
class MyClass {

    func sum(a: Int, _ b: Int) -> Int {
        return a + b
    }
}

按测试单元类或方法旁边的测试按钮再次运行测试,测试应该通过。

要看到它失败(单元测试的一个重要部分),您可以在MyClasssum方法中执行类似于return 0的操作。然后在运行测试时,您将看到以下内容:

enter image description here

您可以返回并修复此问题,然后添加更多单元测试。如果您愿意,还可以为不同的类创建其他单元测试文件。只需右键单击项目导航器中的MyProjectTest组并选择"新建文件",然后选择测试用例类。

enter image description here

相关的

Xcode UI测试示例


您几乎应该总是进行单元测试,并且应该在编写代码时考虑单元测试。极端分子甚至在编写代码之前就开始编写测试(称为TDD——测试驱动开发)。

我给你举一个现实生活中的例子:我最近不得不编写一个支持"间隔"的排序NSarray。也就是说,数组应该知道如何插入一个间隔并保持其排序。

例如,数组如下所示:[1-3,5-9,12-50]。在本例中,数组中有3个间隔,如您所见,它们是经过排序的。在我写完我的课程(我称之为Intervalsarray)之后,我必须编写测试来确保它正常工作,并且如果我或其他人将来对代码进行更改,我不会"破坏"它。

以下是一些示例测试(伪代码):

试验1:

1
2
3
- Create a new IntervalsArray
- Insert a new interval to the array
- (TEST) make sure the array has 1 object in it

试验2:

1
2
3
4
- Create a new IntervalsArray
- Insert 2 intervals into the array: [1-3] and [5-9]
- (TEST) make sure there are 2 items in the array
- (TEST) make sure interval [1-3] comes before interval [5-9]

最后,我做了大约15个测试来覆盖新阵列的各个方面。

这里有一个很好的Xcode单元测试教程。

您还可以编写逻辑测试(比单元测试更复杂)来测试您的UI。阅读一点有关uiautomation的内容,这是苹果测试ui的方法。它不完美,但很好。这是一个很好的教程。

如果你认为自己是一个好的程序员,你应该为你的代码编写单元测试。


在编写必须维护的代码时编写单元测试。也就是说,如果你想重构任何东西——改变代码,但保持行为。这几乎是所有生产代码。

"hello,world"的反例是不要为你打算丢弃的代码操心。一个"尖峰解决方案"只是想知道如何处理一个问题。一旦你弄明白了,扔掉它,重新开始。只有这一次,你才从测试开始。

把TDD称为"极端主义者"让它听起来不合理和不切实际。事实上,一旦你学习了TDD,它就节省了时间/金钱。

有关TDD如何工作的示例,请参阅带有ocunit的单元测试示例。


任何时候编写的应用程序都有类,而这些类不是您自己的类。这是添加单元测试、测试这些类的好时机。

除了最基本的应用程序之外,所有的应用程序都有自己的类,所以单元测试几乎总是一个好主意。

如果您正在创建其他程序员将使用的库,或者您将在多个项目中使用的库,那么这些库应该始终具有单元测试。

当事情发生变化时,单元测试可以节省很多时间,例如,一个新版本的操作系统出现了,用单元测试来测试比仅仅测试应用程序要好得多。