16

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

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

4

4 回答 4

18

其他答案告诉何时但不是真的如何,所以让我也添加一个答案。

什么时候

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

前五分钟左右只是介绍,因此您可以跳到结尾。

如何

我将 Xcode 7 与 Swift 一起使用。

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

我打电话给我MyProject的。如果您在 Project Navigator 中打开 MyProjectTests 组,您将看到 Xcode 已经为您创建了一个名为 MyProjectTest.swift 的单元测试文件。

在此处输入图像描述

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

我遵循testMethodNameBeingTested_Senario_ExpectedBehavior. 单元测试名称必须以“test”开头。

我会做这样的事情:

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类。

添加你的班级。

我正在将 Swift 文件添加到MyProject被调用的MyClass.

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

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

要看到它失败(单元测试的一个重要部分) ,您可以return 0sum. MyClass然后你会在运行测试时看到以下内容:

在此处输入图像描述

您可以返回并修复此问题,然后添加更多单元测试。如果您愿意,您还可以为不同的类制作其他单元测试文件。只需右键单击 Project Navigator 中的 MyProjectTest 组并选择“New File”,然后选择 Test Case Class。

在此处输入图像描述

有关的

Xcode UI 测试示例

于 2015-07-22T17:57:30.277 回答
13

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

我会给你一个真实的例子:我最近不得不编写一个支持“间隔”的排序 NSArray。意思是,数组应该知道如何插入一个区间并保持排序。

例如,数组看起来像这样:[1-3, 5-9, 12-50]。在这个例子中,数组中有 3 个区间,如您所见,它们已排序。在我编写完我的类(我称之为 IntervalsArray)之后,我必须编写测试以确保它正常工作,并且如果我或其他人将来对代码进行更改,我不会“破坏”它。

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

测试1:

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

测试 2:

- 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 的内容,这是 Apple 测试 UI 的方式。它并不完美,但它非常好。这是一个很好的教程

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

于 2012-12-14T19:51:16.557 回答
3

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

“Hello, World”的反例是不要打扰你打算丢弃的代码。“尖峰解决方案”只是为了弄清楚您如何解决问题。一旦你弄清楚了,就把它扔掉,然后重新开始。只有这一次,您从测试开始。

将 TDD 称为“极端主义”听起来不合理且不切实际。事实上,一旦你学会了 TDD,它就可以节省时间/金钱。

有关 TDD 如何工作的示例,请参阅使用 OCUnit的单元测试示例。

于 2012-12-17T01:39:50.197 回答
1

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

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

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

当事情发生变化时,单元测试可以为您节省大量时间,例如,新版本的操作系统问世,使用单元测试进行测试比只测试应用程序要好得多。

于 2012-12-14T19:58:33.443 回答