Devlop iOS Library

iOSのライブラリを作った話

NSDate-Escort という NSDate のカテゴリライブラリを作った話

自己紹介

アイコン

目次

  1. NSDate-Escort
  2. テスト
  3. カバレッジ
  4. モチベーション
  5. ライセンス
  6. CocoaPodsでの公開方法

NSDate-Escort

  • NSDateのカテゴリライブラリ
  • 面倒なところをやってくれるAPIを持ったもの
    • 直で書くにはNSDateComponentを経由するようなもの
  • NSDate-Extensions というライブラリと互換性のあるAPIを持つ

NSDate-Escort の例

#import <NSDate+Escort.h>

// today から 7日後 のNSDateを取得する
NSDate *today = [NSDate date];
NSDate *nextWeekDate = [today dateByAddingDays:7];

// 2つの NSDateを比較した真偽値を取得する
NSDate *yesterday = [NSDate dateYesterday];
BOOL isEarlier = [yesterday isEarlierThanDate:today];// => YES

NSDate-Escort まとめ

  • NSDate-Extensions と互換性のあるAPIを持ってる
  • 中身はスクラッチで実装
  • いくつか追加したメソッドを持ってる
  • 全てのメソッドを通るテストが書かれてる
    • => コードカバレッジ 100%

もっとくわしく

ライブラリのテスト

NSDate-Escort でのテスト

  • テストフレームワークに Kiwi を使用
  • 慣れてるから選択
  • テストの中身というよりも、何をテストしたいかを書きたかった
  • テストは境界値を意識して書いた

QuickCheck

  • テストしたい値は色々ある
    • 日にち、週、月、年 をまたいだ時...
    • 0を渡した時、マイナスの値を渡した時...
    • 全部考えるのは大変
  • 一定の規則に合った適当な値でテストをして網羅性を高めたい
  • QuickCheckの出番

NLTQuickCheck

QuickCheckは、一定の規則に従った値をランダムに生成して、それを使って複数回(だいたい100回くらいっぽいです)のテストケースを実行する、という仕組みです。 ユースケースとしては何らかの不変なロジックに対して、自分で生成する分では補いきれないケースをランダムで生成し、テストしてくれる、

ランダムテストライブラリ、NLTQuickCheck作った - yaakaito's diary

QuickCheckライブラリは NLTQuickCheck を使った

QuickCheckするメソッド

  • QuickCheckで補うようにテストする
  • そのメソッドの性質は決まってる

例)

引数に-1 を渡したら -1 される
引数に 0 を渡したら +0 される
引数に 1 を渡したら +1 される  
…
=> メソッドのロジックは不変、これを網羅するパターンを毎回書くのは大変

なぜテストがあるといいの?

  • メンテナンスされてる感じがでる
  • サンプルコードの代わりにもなる
    • ドキュメントは別にあったほうがベスト
  • Travis CIのバッチが貼れる! Build Status
    • Pull Request受け入れるときに役に立つ

Travis CI

  • Objective-C Project も無料でテストを動かせる
  • Pull Requestされた時に壊れてないかチェックできる
  • 自分以外の環境で実行しておく価値(ビルドテスト)
    • Githubにコードを上げたつもりでも環境依存が起きてる場合がある
    • 第三者(Travis CI)でビルドできる事で依存性がないかを確認できる

コードカバレッジ

コードカバレッジを取る理由

  1. テストを書きたいね
  2. -> どうせならコードカバレッジも取りたいね
  3. -> Coveralls というサービス使いたいね
  4. => Coveralls のバッチが貼れる!! Coverage Status

Coveralls を使いためにコードカバレッジを取る!!

コードカバレッジを取る方法

コードカバレッジを取る意味

  • NSDate-Extensions の再実装との孤独な戦い…
    • 何か指標が合ったほうがいい
  • APIを実装する -> カバレッジ率が上昇する
    • 目に見える変化があることでモチベーションを保てる
  • NSDate-Escort の場合は 0%から100% にすることを目標にした

コードカバレッジを計測してみる前は”目安に過ぎないから計測してもしなくても大差ない”というような気がしていたのですが、 計測してその結果を活用して開発をしてみると”無意味な変更でパーセンテージが変化する場合があるから目安”なのかなと思いました。 で、結局目安と言いながらも明らかにカバーできていない箇所を発見できたりして開発にとても役立つ

コードカバレッジを計測してみた感想

Coveralls

Botと戯れる

image

ライセンス

LICENSEファイルを作る

  • ライセンスは必ず書きましょう
    • readme か LICENSE ファイルを作る
  • Githubではリポジトリ作成時にライセンスが選べるようになった
  • コマンドラインから LICENSE ファイルを生成する
  • CocoaPodsで公開する場合もライセンスは必須

CocoaPods

What's Podspec?

Podspecの作り方

  • pod spec create <Name>
  • リポジトリにtagを付ける(CocoaPods/Specする場合は合ったほうがいい)
  • 項目を穴埋めする
  • pod spec lint でWarningがなくなるまで繰り返す

CocoaPods/SpecにPull Request

実際の流れ

pod spec lint でエラーがでないpodspecを作る

$ cd ~/.cocoapods/master
$ hub fork
$ cp ~/HOGEHOGE.podspec ~/.cocoapods/master/HOGEHOGE/VERSION/
$ git push && Pull Request
  • ブランチ切って書いてあるけど、masterでやってる人が殆ど
  • pod spec lint でエラーが出てる場合ははじかれる

Pull Requestしない場合

  • CocoaPods/Specs に公開しないでもpodspecは公開できる
  • :git => 'リポジトリURL' を指定すれば、リポジトリにあるpodspecからインストールできる

Podfile に以下のように書く

pod 'NSDate-Escort', :git => 'https://github.com/azu/NSDate-Escort.git'

おわり