2010-11-02 21 views
1

我正在使用iPhone Sen测试框架进行测试。我需要测试来自服务器的异步响应。任何人都可以帮助我找出测试方法。在Sen框架中测试异步响应

谢谢

+2

可能的重复:http:// stackoverflow。com/questions/2162213/how-to-unit-test-asynchronous-apis – tonklon 2010-11-02 09:11:56

+0

谢谢tonklon。 – Dilshan 2010-11-02 12:04:37

回答

3

这可能是一个重复的问题,但我不回答原来的同意。我已经在这个问题上描述了为什么。

总之,为您的测试创建自定义运行循环是复杂而脆弱的。如果删除对返回异步响应的外部服务的依赖关系,并在测试中模拟响应,则您的测试将运行得更加一致且更快。这样,如果外部服务停止,您的测试不会失败,并且您的测试运行速度会更快。

有一些库可以重新打开NSURLConnection这样的类,并使其很容易实现。由于Objective C的动态属性,对于单个类(如NSURLConnection)也是相对简单的。Here is an example

+0

HI Adam,我刚刚阅读这篇文章和你的另一篇文章,并同意你对测试的看法。通过使用外部服务器,它将测试从测试类变为集成测试,这是另一回事。 – drekka 2010-11-14 23:05:18

+0

感谢Adam对您的回复 – Dilshan 2010-11-15 06:34:51

+0

但是,Drekka,如果您想*整合测试呢? – 2013-01-26 13:28:14

1

我不使用森测试,因为它不会在模拟器或设备上运行(或者至少没有当我第一次开始做Objective C的最后一年),而不是我用GHUnit作为一个测试框架和OCMock作为嘲弄的框架。 GHUnit将在设备上运行测试,以确保代码的正确性。 OCMock允许完全嘲笑,部分模拟和方法调整,这是强大的单元测试工具。

我认为在这种情况下有两个部分要测试。

  1. 单元测试单个组件(GHUnit和OCMock)。在这里你可以直接调用方法并模拟你的类将运行的环境。所以你不需要服务器设置来测试异步调用。只需在单元测试中实例化该类并将其称为方法。

  2. 集成测试。 (仅适用于GHUnit)在这里您要做一个基本的测试,以确保您对代码和服务器之间的通信的理解是正确的。所以这是你需要服务器的地方。根据您的需求,这可能是一个或很多工作量。例如,当我这样做时,我刚刚安装了一个带有EJB3 bean的glassfish服务器来模拟我要连接的服务器。重要的是,您设置的服务器必须与最终生产服务器的行为完全相同。

所以基本上这是一个双管齐下的方法。单元测试检查代码的每个角落。集成测试以确保正确处理与服务器的整体通信。

使用两者很重要,因为虽然单元测试可以检查难以用集成测试进行检查的功能,但它与您对类和服务器之间的通信的理解一样准确。所以你至少需要一个基本的集成测试来确认你的理解是正确的。但是不要浪费时间写很多集成测试来检查班级的每一个角落。它总是比单元测试困难得多。

+0

听起来不错。期待用户使用这种方法。测试期间我遇到的其他事情是时间消耗。当我测试使用NSRunLoop时,需要很多时间。那么有什么方法可以在你的方法中并行处理测试用例吗? – Dilshan 2010-11-15 06:38:58

+0

GHUnit的确将运行测试作为后台任务,并且如果需要的话可以将它们切换到主线程(例如UI Stuff)。我还发现一篇博客文章谈论通过在主线程上运行而不是后台运行所节省的时间,因为启动一个新线程需要花费时间:(http://jorudolph.wordpress.com/2009/ 23分之10/ ghunit-并行测试执行-性能影响/)。 GHUnit也可以使用SenTest测试。至于运行循环。从OCMock嘲笑你可能可以避免使用runloop。只是一个想法。 – drekka 2010-11-16 02:49:09