iPhone 原生应用的测试驱动设计

Posted

技术标签:

【中文标题】iPhone 原生应用的测试驱动设计【英文标题】:Test Driven Design for iPhone Native apps 【发布时间】:2008-10-12 18:25:06 【问题描述】:

我正在试验 iPhone SDK 并做一些 TDD ala Nic 博士的 rbiPhoneTest 项目。我想知道有多少(如果有的话)成功地使用了这个或任何其他 iPhone/Cocoa 测试框架?更重要的是,我想知道如何最好地断言专有的二进制请求/响应协议。这个想法是通过网络发送二进制请求并接收二进制响应。请求和响应是使用 byte and'ing 和 or'ing 创建的。我正在使用黄金副本模式来测试我的请求。这是我到目前为止所拥有的。不要笑,因为我是 Objective C 和 Ruby 的新手:

require File.dirname(__FILE__) + '/test_helper'
require 'fileutils'
require 'io'

require "MyModel.bundle"
OSX::ns_import :MyModel

module MyTestExtensions
  def is_absolute_path(path)
    return /^\/.*/.match(path)
  end

  def parent_directory(file)
    dir = file
    if(! is_absolute_path(dir))
      dir = File.expand_path(dir)
    end
    dir = File.dirname(dir)
    assert is_absolute_path(dir), "Expecting an absolute path with #dir"
    return dir
  end

  def assert_NSData_contains_bytes_from_file(file, data)
    assert_not_nil data, "Data should not be nil."
    assert data.bytes, "data should have bytes"
    data.length.times  |i|
      expected = file.getc
      assert_not_nil expected, "Expected only #i bytes. Actual data contains more."
      actual = data.bytes.int8_at(i)
      assert_equal expected, actual, "Bytes should be equal at offset #i expected #expected.chr but was #actual.chr"
    
    expected = file.getc
    raise AssertionFailedError, "Expecting #expected.chr at offset #data.length" unless expected == nil
  end

end

class TestMyModel < Test::Unit::TestCase
include OSX
include MyTestExtensions

  def this_files_dir
    return parent_directory(__FILE__)
  end

  def setup
    @expectedReq = File.new("#this_files_dir/ExpectedMyReq")
    # @expectedReq = File.new("#this_files_dir/hello.txt")
    assert File.exist?("#this_files_dir/ExpectedMyReq"), "The file [#@expectedReq.path] should exist."
  end

  def test_my_model_class_exists
    MyModel
  end

  def test_can_init_instance
    assert MyModel.instancesRespondToSelector(:init), "MyModel Should define :init"
  end

  def test_my_model_can_request_my_data
    myModel = MyModel.alloc.init
    data = myModel.requestMyData 'Some query text'
    assert_NSData_contains_bytes_from_file @expectedReq, data
  end

end

【问题讨论】:

【参考方案1】:

我对 Ruby 或二进制协议了解不多,但如果您对 iPhone 上的单元测试感兴趣,您可能想查看Google Toolbox for Mac。我用它测试我的 OpenGL ES 应用程序取得了巨大成功。

【讨论】:

我同意,这对我测试我的静态类非常有效。 code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting【参考方案2】:

Cliff,从长远来看,您最好在纯 ObjC TDD 工具上投入时间。我已经成功地在 fmdb-migration-manager 中使用了我自己的 rbiphonetest 库,但它的用处可能仅限于库等。即使那样,毫无疑问会有足够的“在 Cocoa 中工作但在 UIKit 中失败”的场景使 rbiphonetest 的使用变得可疑。希望有一天 RubyCocoa 可以针对英特尔 UIKit 库构建,然后我认为它会非常有用和强大。

【讨论】:

以上是关于iPhone 原生应用的测试驱动设计的主要内容,如果未能解决你的问题,请参考以下文章

云原生时代,领域驱动设计思想(DDD)如何落地?

云原生的设计哲学

DDD(领域驱动设计)示例目录结构

DDD(领域驱动设计)示例目录结构

2017-2018-1 201553334 实验四 外设驱动程序设计

2019-2020-1 20175218 实验四 外设驱动程序设计