Xcode单元测试

16

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

我想了解什么情况下值得使用单元测试,并且希望有一些示例。


2
“什么时候值得使用单元测试”- 有人认为它总是不可避免的;我认为仅在大型项目和库中才是必要的。 - user529758
1
点击这里搜索。获取有关单元测试选项和教程的完整信息。 - rsswtmr
1
一个很好的用途是当你有一个连接服务器的应用程序时。你可以在单元测试中单独设置它们,以便在不运行应用程序的情况下进行测试。 - Yuliani Noriega
我认为随着你编程的经验越来越丰富,你会发现对某些看似微不足道的代码进行最细微的更改可能会产生你无法预见的有害后果。单元测试等其他方法,如果做得正确,可以帮助防止由于轻微的代码更改而引起的错误。 - Snowman
4个回答

19

其他答案讲述了何时进行单元测试,但没有真正说明如何进行,因此让我也添加一个答案。

何时

任何时候,当您编写要保留的生产代码时,都应该对其进行单元测试。我看过的最有帮助的培训是以下这个由两个部分组成的视频系列:

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

如何

我正在使用带有Swift的Xcode 7。

开始一个新项目并添加一个单元测试。

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

enter image description here

您暂时可以删除所有示例方法,然后添加一个新的func来测试自己的类方法。请确保在顶部添加@testable import MyProject这一行。如果您的项目名称中有空格,请将空格替换为下划线。(例如,“My Example Project”将使用 @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类。

添加你的类。

我正在向MyProject添加一个名为MyClass的Swift文件。

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原则,我只会添加函数名称,而不会返回正确的值。”?唯一返回正确值的地方是测试(3)。你的意思是在测试中只写函数名吗?请解释一下。谢谢。 - Edison
@tymac,我想我的意思是我会编写类方法,让它返回0,运行测试并观察其失败,修复该方法,然后再次运行测试并观察其通过。不过我的句子有点混乱,所以我刚刚将其删除了,因为TDD并不是这个答案的主题。 - Suragch
谢谢。不过知道了。 - Edison

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,它是苹果测试UI的方式。虽然不完美,但还是相当不错的。这里有一个优秀的教程

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


3
每次编写需要维护的代码时,请编写单元测试。也就是说,如果您想要重构任何内容-更改代码但保持行为,就需要编写单元测试。这几乎涉及到所有生产代码。
不用理会计算机编程中的“Hello, World”的反例。 “刺探解决方案”只是为了找出解决问题的方法。一旦找到,就可以舍弃它并重新开始。但是,这次您在编写代码时要开始写单元测试。
将TDD称为“极端主义者”会让人觉得它不理性且不实用。事实上,一旦学会了TDD,它可以节省时间/金钱。
请参见使用OCUnit进行单元测试示例以了解TDD的工作方式。

1

每当您编写一个包含不属于自己的类的应用程序时,这是一个很好的时机来添加单元测试以测试这些类。

除了最基本的应用程序外,其余的应用程序都会有自己的类,因此几乎总是一个很好的想法来进行单元测试。

如果您正在创建其他程序员将使用或者您将在多个项目中使用的库,则应始终进行单元测试。

单元测试可以节省大量时间,特别是当一些东西发生变化时。例如,当操作系统的新版本发布时,与其仅测试应用程序,还不如使用单元测试进行测试。


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