kazakago’s LGTM

個人的な書き物置き場

Kotlinファーストなテストフレームワークについて

Kotlinにおけるテストフレームワークについて断片的な知識しかなく今まで雰囲気で技術選定していたので、主要なものを軽く調べてみた結果を備忘録として簡単にまとめてみます

調査対象

Kotest

https://kotest.io/

Kotlin Multiplatformにも対応した包括的なテストフレームワーク
Kotlin JVMの場合はテストフレームワークJunitを利用してアサーションライブラリだけを利用することも可能
フレームワークとしては複数のスタイルが定義されており様々な書き方に対応している 混乱を招かないかこれ
アサーションとしては拡張関数や中置関数を利用した記述が特徴で流れるように書ける

class StringSpecTest : StringSpec() {
    private val calc = Calc() 
    init {
        "10 割る 5 は 2 になる" {
            calc.divide(10, 5) shouldBe 2
        }
        "10 割る 0 は例外(ArithmeticException)が起きる" {
            shouldThrow<ArithmeticException> { calc.divide(10, 0) }
        }
    }
}

Spek

https://www.spekframework.org/

こちらはテストフレームワーク、2.0からMultiplatform対応がされたようだがいかんせんドキュメントが少ない
フレームワークとしてはカッコでネストしていく記法で一部Hookっぽい部分もありちょっと癖を感じる
アサーション機構はなくHamcrestやkotlin.test など別のアサーションライブラリと組み合わせて使っていくっぽい

class SimpleTest : Spek({
    describe("a calculator") {
        val calculator = SampleCalculator()
 
        it("should return the result of adding the first number to the second number") {
            val sum = calculator.sum(2, 4)
            assertEquals(6, sum)
        }

        it("should return the result of subtracting the second number from the first number") {
            val subtract = calculator.subtract(4, 2)
            assertEquals(2, subtract)
        }
    }
})

Kluent

https://markusamshove.github.io/Kluent/

アサーションのみを担うライブラリ、一部Multiplatformにも対応しているが中途半端
書き味はKotestに非常に近くて個人的には好み、ただだいぶ放置気味でメンテ不安なのでKotestのほうが個人的にはおすすめ

class SampleTest {
    @Test
    fun test {
        val value = 10
        value shouldBeInstanceOf Int::class
    }
}

atrium

https://docs.atriumlib.org/

こちらもMultiplatform対応のアサーションライブラリ、公式サイトが無駄に渋い
expect()を軸としたメソッドチェーンを多用してアサーションを組み立てていくのが特徴

 class SampleTest {
     @Test
     fun test {
         expect(4 + 6) {
             toBeLessThan(5)
             toBeGreaterThan(10)
         }
     }
 }

所感

いくつか調べてみた感じ、私のようなJunit+Hamcrestに慣れきった人が今から新規採用するなら下記の技術群がいいのではないかと感じました

DroidKaigi 2019で発表する「中規模以上のアプリ開発におけるCIレシピとリリースフロー戦略」について

DroidKaigi 2019にて
中規模以上のアプリ開発におけるCIレシピとリリースフロー戦略
というタイトルで登壇します
会場にお越しになる方はご興味ありましたら見に来て下さい!

  • 時間 : 2019/02/08 (Day 2) 10:30-11:00
  • 場所 : Room2

droidkaigi.jp

概要

BitriseやCircleCI, TravisCIなどに代表されるCIツール(継続的インテグレーション)の導入方法を解説した記事は多くありますが、実際に運用フローに組み込むところまで言及されていることは少ないと思います。
複数人のエンジニアが絡む中規模以上の開発においては、開発フローに一定のルールを設け、ブランチ運用とCIをうまく連携させて自動化しヒューマンエラーを減らすことが大事です。

3〜4人での開発体制の中規模アプリを2週に1度のペースでリリースを年単位で続けた自身の経験を元に、実運用に耐えうるブランチ運用とCIレシピから事故の少ないリリースフローまでをGitFlowとBitriseをベースに解説します。
また、Google Play Developer Publishing APIを活用して安定的なリリースを行うための手法や各プロダクトに合わせたカスタマイズ方法についても、実際の業務での運用を元に解説します。

目次

  1. withにおける現状とマイルストーン
  2. Git-Flowを用いたアプリ開発フロー
  3. CIツールとブランチ運用の連携による作業自動化
  4. Google Play Developer APIを活用した安定的なリリース手法

スライド

https://speakerdeck.com/kazakago/zhong-gui-mo-yi-shang-falseahurikai-fa-niokeruciresihitoririsuhurozhan-lue

スライド内で紹介したリンク

git-flow cheatsheet

Git-Flowの解説をしている代表的なサイト

git-flow cheatsheet

bitrise.yml

スライド内で紹介したBitrise用の汎用yamlファイル

bitrise.yml example · GitHub

StepReleaseDispatcher

スライド内で紹介したPlayストアにおける自動的な「段階的な公開」を行うためのKtor製サーバープログラム

github.com

AniStackというアニメ視聴管理アプリを作った話

友人と2人でAniStackというアニメ視聴管理アプリを作ったので忘れないうちにやったことを書き留めておこうかと思います。
よければダウンロードしてね!

作ったもの

f:id:kazakago:20180707194803j:plainf:id:kazakago:20180707194527j:plainf:id:kazakago:20180707194555j:plainf:id:kazakago:20180707194757p:plain

iOS

AniStack

AniStack

  • Kensuke Tamura
  • エンターテインメント
  • 無料

Android

play.google.com

きっかけ

エンジニアの友人である @alumys となんかアプリ作りたいよねって話をしていて、お互いアニメ好きだったので視聴管理できるアプリ作ろうという話から生まれました。

Annict

Annictというアニメ視聴管理サービスがあるのですが、そちらではAPIを公開されており、なおかつオフィシャルのクライアントアプリもなかったのでちょうどよさそうという話になりました。
(有志でクライアントアプリを作っている先人の方は何名かおりましたが)

なんとこのサイト、@shimbacoさんという方が個人で運営しているとのこと。このクオリティは素晴らしいの一言に尽きます。
私もユーザーで楽しく使わせて頂いているのでこの場で感謝申し上げます。

技術的なこと

担当割り振り

お互いAndroid/iOSどちらも書けるのですが相談の上、自分がiOS担当、@alumysAndroid担当で実装しました。
またアイコンやロゴについてはデザイナーの方にも協力頂いています。

iOSはリリースを維持するのに毎年お布施が必要なので、新規アカウントを作らず元々持っていた自分名義のアカウントですべてリリースしています。

ツール

お互い別の会社に勤めているため、効率的に作業を進める必要がありいくつかのツールに頼りました。
オープンソースではないためクローズドに扱えるツールを中心に使いました。

ちなみに個人プロダクトであってもCIで自動的にDeploygateデプロイ+Slack通知を組むとめちゃんこ便利です。

言語

f:id:kazakago:20180707200633p:plainf:id:kazakago:20180707200646p:plain

どちらもネイティブで書いており、iOSはフルSwift・AndroidはフルKotlinで書いています。
あとはアーキテクチャやクラス設計、画面仕様だけ合わせてそれぞれで実装しています。

アーキテクチャ

アーキテクチャはお互い業務でも使っているCleanArchitecture + MVPで実装しています。 RxとDIツールを組み合わせて使っています

https://github.com/android10/Sample-Data/blob/master/Android-CleanArchitecture/clean_architecture.png?raw=true

ぶっちゃけ個人規模であればMVCで雑に作るのが最速かつ問題もそこまで起きないと思いますが、仕事だとやるのが難しいガチガチの設計で組みたいよねという話になりました。

画面設計

各OSで用意されているプレーンなコンポーネントを中心にシンプルな画面設計にしています。

最初JustInMindを使ってプロトタイプを組もうと思ったのですが、高機能すぎてワイヤーだけサクッと作るというのが逆に難しく、結局紙に書いてそれを直接実装しました。

この辺はAndroidiOSコンポーネントを把握しているエンジニア同士だからこそ、雑な画面設計から実装のイメージが付く部分なのかなとも思ったりします。

ただ、両OSの基本デザインを崩さないようには注意しました。(iOSAndroidアプリにしないとか)

アイコン・ロゴ

f:id:kazakago:20180707195635p:plain

アイコンやストアロゴなどのは流石に自前で用意できなかったので、会社のデザイナーさんに依頼して作ってもらいました。(もちろん有料でw)

ちなみにAndroidのアイコンはAdaptive-Iconに対応しています。
個人アプリでAdaptive-Iconに対応してるアプリは少ないのではないでしょうか。
細かいところに気を使ってくれるデザイナーさんには頭が上がりません。

こういうとき繋がりがあると非常に助かりますね。

UI/UX実装

UXを組むときに特に注意したのは、ユーザーの操作をなるだけ妨害せずに通信中かどうかを示す部分です。

ログイン中などはProgressHUDを表示して操作できないようにしていますが、その他非同期で取得できるものは画面上に通信中の表示を出しつつ、ユーザーの操作を邪魔しないような配慮をしています。
たとえば以下の作品詳細画面は、画面下部の視聴ステータスを非同期で取得しています。
変更時も非同期で情報の送信を行い読み込み中のストレスを最大限抑えています。

f:id:kazakago:20180707233307g:plain

また作品一覧画面では下まで読み込んだときにページング処理を行っていますが、読み込みに失敗した際は最後のセルにエラーの表示を出しています。
さらに再試行ボタンを押した場合にはその部分から再試行を行い、ロード済みの情報を失わずにシームレスに復帰できるよう実装をしました。

f:id:kazakago:20180707233436g:plain

リリースしてみて

自分自身すでにOSを変えながら何度かソフトやアプリをリリースしていますが、やはりいちばん大変なのが8割方作った後の作業だったりします。

なにかを出したことがある方ならよくおわかりだと思いますが、最後の詰めが一番めんどくさく手間がかかります。
アプリの場合はUIの細かい微調整や使い勝手の向上、ストア情報の準備や利用規約の用意、このあたりをいかに手を止めずに進められるかが個人でプロダクトをリリースするための肝になるかなぁと感じています。

今後

現在は別のプロダクトに着手しているためAniStackについては直近で大きなアップデートは予定していません。
ただ本家AnnictのWebサイトより(APIが提供されておらず)機能的が劣る部分があるため、もし今後APIが拡充された場合は追従して機能追加していきたいと考えています。

DroidKaigi 2018で発表する「Annotation Processingを駆使したコード生成でボイラープレートコードを駆逐しよう!」について

DroidKaigi 2018にて
Annotation Processingを駆使したコード生成でボイラープレートコードを駆逐しよう!
というタイトルで登壇します
会場にお越しになる方はご興味ありましたら見に来て下さい!

  • 時間 : 2018/02/08 (Day 1) 16:50-17:20
  • 場所 : Room5

droidkaigi.jp

内容

有名どころのライブラリにも活用されているAnnotation Processingによるコード生成について、そもそもどんなことができるのか、どうやって作られているのか、Androidからはどのように活用できるのかを解説します

目次

  1. Annotation Processingって?
  2. Annotationとコード生成
  3. JavaPoetとKotlinPoet
  4. Android開発においてどのように活用できるのか
  5. Kotlinから使う場合の注意点

スライド

https://speakerdeck.com/kazakago/annotation-processingwo-qu-shi-sitakodosheng-cheng-de-boirapuretokodowoqu-zhu-siyou

スライド内で紹介したリンク

サンプルコード

Annotation Processingを使ってトーストを表示するだけのサンプルコードです
クローンしてビルドするだけで動作します

github.com

Preferhythm

スライド内で紹介したSharedPreferences関連のラッパークラス自動生成ライブラリです

github.com

Factolize

スライド内で紹介したActivity/Fragmentのファクトリーメソッド自動生成ライブラリです

github.com

個人的に公開してるものまとめ

他のWebサービスでも活動しているのでなんかあったときのために個人的に活動してるもののリンク一覧を作ってみました

Github

Android向けのライブラリ作ってます
体裁を整えてあるものはピン留めしてあります

github.com

Qiita

技術的な情報の発信用
AndroidiOSのことばっかり書いてます

qiita.com

Twitter

何書けばいいのかわからなくて悩む

twitter.com

SpeakerDeck

今まで発表した資料一覧。LT多め

https://speakerdeck.com/kazakago

Google Play

Android向けで作ったもの

play.google.com

App Store

iOS向けで作ったもの

https://itunes.apple.com/jp/developer/kensuke-tamura/id833563822?mt=8

Vector

Windows向けにむかーし作ってたもの

https://www.vector.co.jp/vpack/browse/person/an053354.html