2012-12-14 129 views
11

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

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

+2

“时,它是值得的使用单元测试” - 有些人认为它总是难免的;我会说这只是大型项目**和**库所必需的。 – 2012-12-14 18:40:16

+1

搜索[here](http://stackoverflow.com/questions/33207/what-is-the-best-way-to-unit-test-objective-c-code)。有关单元测试选项和教程的完整信息。 – rsswtmr

+1

一个很好的用法是当你有一个应用程序将一个URL连接到一个服务器。您可以在单元测试中单独设置它们,以测试它们而无需运行应用程序。 –

回答

9

你应该几乎总是进行单元测试,并且应该用单元测试编写代码。 即使在编写代码之前,极端主义者也会编写测试(它被称为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次测试,以盖我新阵列的每个方面。

这是good unit-testing with Xcode tutorial

你也可以编写逻辑测试(比单元测试更复杂)来测试你的UI。阅读有关UIAutomation的一些信息,这是Apple测试UI的方式。这并不完美,但它非常好。 Here's an excellent tutorial关于此。

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

+2

“你应该经常进行单元测试” - 即使是Hello World,对吧? (不,不是,让我们保持合理,好吗?) – 2012-12-14 19:54:39

+0

好的,编辑我的答案。 –

+0

@ EliGanem谢谢。 – 2012-12-14 19:58:02

1

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

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

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

当事情发生变化时,单元测试可以为您节省大量时间,例如,新版本的OS出来了,用单元测试测试然后测试应用程序会好得多。

3

编写单元测试任何时候你写代码,你将不得不维护。也就是说,如果你想重构任何东西 - 改变代码但保持行为。这几乎是生产代码的每一点。

“你好,世界”的反例是不打扰你打算扔掉的代码。一个“秒杀解决方案”就是要弄清楚你如何解决问题。一旦你想出来,扔掉它,然后重新开始。只有这一次,你从测试开始。

调用TDD“极端主义”使其听起来非理性和不切实际。事实上,一旦你学习TDD,它可以节省时间/金钱。

有关TDD如何工作的示例,请参见Unit Testing Example with OCUnit

13

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

任何你正在编写的生产代码,你会不断的时候,你应该有单元测试它。我在这看到的最有帮助的培训是以下两个部分组成的系列视频:

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

如何

我正在使用Xcode 7与Swift。

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

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

enter image description here

您可以删除所有的示例方法现在并添加一个新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 
    } 
} 

如果我真的遵循TDD原则,我只会添加函数名称,而不会返回正确的值。但是为了简洁起见,我现在就要谈谈整个方法。

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

要看到它失败(单元测试的重要组成部分),您可以在MyClasssum方法中执行类似return 0的操作。然后你会看到如下当您运行测试:

enter image description here

你可以回去和解决这个问题,然后添加更多的单元测试。如果你愿意,你也可以为其他单元测试文件制作不同的类。只需右键单击Project Navigator中的MyProjectTest组,然后选择“New File”,然后选择Test Case Class。

enter image description here

相关

Xcode UI Test example