Slide 1

Slide 1 text

© KAUCHE, Inc. LT: KaucheMockKit 導入した話

Slide 2

Slide 2 text

© KAUCHE, Inc. 自己紹介 ● 名前 ○ 深谷 哲史 (ふかや あきふみ) ● 会社 ○ 株式会社カウシェ (2020/07 ~ 現在) ● 役職 ○ 取締役CPO ● アカウント ○ Twitter: @akifumifukaya ○ Facebook: Akifumi Fukaya ○ GitHub: akifumi

Slide 3

Slide 3 text

© KAUCHE, Inc.

Slide 4

Slide 4 text

© KAUCHE, Inc. アジェンダ ● Multi Modules 導入状況 ● Motivation ● About KaucheMockKit ● Dependency ● Summary

Slide 5

Slide 5 text

© KAUCHE, Inc. Multi Modules 導入状況

Slide 6

Slide 6 text

© KAUCHE, Inc. Multi Modules 導入状況

Slide 7

Slide 7 text

© KAUCHE, Inc. Multi Modules 導入状況 ● KaucheCoreKit ● KaucheAPIKit ● KaucheShopifyKit ● KaucheMockKit ● KaucheDesignKit ● Kauche

Slide 8

Slide 8 text

© KAUCHE, Inc. Multi Modules 導入状況 ● KaucheCoreKit ○ 全モジュール/全レイヤーから参照され、基 盤となるFramework ○ 全モジュールの共通言語となるインターフ ェースやツールを搭載している ○ インターフェース ■ Models ■ Protocols ○ ツール ■ Extensions ■ Utilities ● KaucheAPIKit ● KaucheShopifyKit ● KaucheMockKit ● KaucheDesignKit ● Kauche

Slide 9

Slide 9 text

© KAUCHE, Inc. Multi Modules 導入状況 ● KaucheCoreKit ● KaucheAPIKit ○ API通信を行うFramework ○ カウシェサーバーとの通信を担っている ○ 通信プロトコルの隠蔽 ○ KaucheCoreKit.Models にマッピングし、 値を返す ● KaucheShopifyKit ● KaucheMockKit ● KaucheDesignKit ● Kauche

Slide 10

Slide 10 text

© KAUCHE, Inc. Multi Modules 導入状況 ● KaucheCoreKit ● KaucheAPIKit ● KaucheShopifyKit ○ EC構築ツールShopifyとの通信を行う Framework ○ Shopifyとの通信を隠蔽 ○ KaucheCoreKit.Models にマッピングし、 値を返す ● KaucheMockKit ● KaucheDesignKit ● Kauche

Slide 11

Slide 11 text

© KAUCHE, Inc. Multi Modules 導入状況 ● KaucheCoreKit ● KaucheAPIKit ● KaucheShopifyKit ● KaucheMockKit ○ カウシェのモックデータを定義する Framework ○ Previews, Unit Tests などで使用 ● KaucheDesignKit ● Kauche

Slide 12

Slide 12 text

© KAUCHE, Inc. Multi Modules 導入状況 ● KaucheCoreKit ● KaucheAPIKit ● KaucheShopifyKit ● KaucheMockKit ● KaucheDesignKit ○ カウシェのデザインコンポーネントを保持 ○ Colors, Styles, UI Components を有する ● Kauche

Slide 13

Slide 13 text

© KAUCHE, Inc. Multi Modules 導入状況 ● KaucheCoreKit ● KaucheAPIKit ● KaucheShopifyKit ● KaucheDesignKit ● KaucheMockKit ● Kauche ○ カウシェのアプリケーション ○ 現在は、全Featureのコードが置いてある ○ 将来的には、各Featureごとにモジュールを 分割し、 Kauche モジュールはアプリケー ションのみにできるように薄くしていきた い ○ そうすることで、よりチーム開発がしやす い状態を目指す

Slide 14

Slide 14 text

© KAUCHE, Inc. Motivation

Slide 15

Slide 15 text

© KAUCHE, Inc. Motivation ● Unit Tests / Xcode Previews で使用するモックデータの定義が重複していた ● モックデータは開発用途であり、Production コードからは除外したい ● 上記の課題から、モックデータの定義を切り出し KaucheMockKit としてまとめることに

Slide 16

Slide 16 text

© KAUCHE, Inc. About KaucheMockKit

Slide 17

Slide 17 text

© KAUCHE, Inc. About KaucheMockKit ● 以下の役割を担っているFramework ○ モックデータの格納 ○ モック用のインタフェース定義 ● 対応しているModule ○ KaucheCoreKit ○ KaucheAPIKit

Slide 18

Slide 18 text

© KAUCHE, Inc. Group.swift in KaucheCoreKit public struct Group { public let id: String public let ownerUserId: String public let productId: String public let groupRequirement: GroupRequirement public let expireDate: Date public let status: GroupStatus public let currentCompletedPurchaseCount: UInt32 public let productHandle: String public let url: String public let message: String public init(id: String, ownerUserId: String, productId: String, groupRequirement: GroupRequirement, expireDate: Date, status: GroupStatus, currentCompletedPurchaseCount: UInt32, productHandle: String, url: String, message: String) { self.id = id self.ownerUserId = ownerUserId self.productId = productId self.groupRequirement = groupRequirement self.expireDate = expireDate self.status = status self.currentCompletedPurchaseCount = currentCompletedPurchaseCount self.productHandle = productHandle self.url = url self.message = message } }

Slide 19

Slide 19 text

© KAUCHE, Inc. Group+Extension.swift in KaucheMockKit (Mockable) import KaucheCoreKit public extension Group { static func mock( id: String = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", ownerUserId: String = "user_id", productId: String = "1234567890", groupRequirement: GroupRequirement = .mock(), expireDate: Date = Date(), status: GroupStatus = .unspecified, currentCompletedPurchaseCount: UInt32 = 0, productHandle: String = "product_1", url: String = "https://kauche.dev/groups/group_id", message: String = "" ) -> Group { .init(id: id, ownerUserId: ownerUserId, productId: productId, groupRequirement: groupRequirement, expireDate: expireDate, status: status, currentCompletedPurchaseCount: currentCompletedPurchaseCount, productHandle: productHandle, url: url, message: message) } }

Slide 20

Slide 20 text

© KAUCHE, Inc. Group+Extension.swift in KaucheMockKit (Active Group) import KaucheCoreKit public extension Group { static func active( id: String = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", ownerUserId: String = "user_id", productId: String = "1234567890", groupRequirement: GroupRequirement = .init( lowerLimitUserCount: 2, expireDuration: 86400, upperLimitUserCount: 0, upperLimitUserCountSetting: .isNotActive ), expireDate: Date = Date(timeIntervalSinceNow: 100), status: GroupStatus = .inProgress, currentCompletedPurchaseCount: UInt32 = 1, productHandle: String = "product_1", url: String = "https://kauche.dev/groups/group_id", message: String = "" ) -> Group { .mock(id: id, ownerUserId: ownerUserId, productId: productId, groupRequirement: groupRequirement, expireDate: expireDate, status: status, currentCompletedPurchaseCount: currentCompletedPurchaseCount, productHandle: productHandle, url: url, message: message) } }

Slide 21

Slide 21 text

© KAUCHE, Inc. Group+Extension.swift in KaucheMockKit (Expired Group) import KaucheCoreKit public extension Group { static func expired( id: String = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", ownerUserId: String = "user_id", productId: String = "1234567890", groupRequirement: GroupRequirement = .init( lowerLimitUserCount: 2, expireDuration: 86400, upperLimitUserCount: 0, upperLimitUserCountSetting: .isNotActive ), expireDate: Date = Date(timeIntervalSince1970: 1_596_683_282), status: GroupStatus = .expired, currentCompletedPurchaseCount: UInt32 = 1, productHandle: String = "product_1", url: String = "https://kauche.dev/groups/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", message: String = "" ) -> Group { .mock(id: id, ownerUserId: ownerUserId, productId: productId, groupRequirement: groupRequirement, expireDate: expireDate, status: status, currentCompletedPurchaseCount: currentCompletedPurchaseCount, productHandle: productHandle, url: url, message: message) } }

Slide 22

Slide 22 text

© KAUCHE, Inc. How to use mock data #if DEBUG import KaucheCoreKit import KaucheMockKit struct GroupBuyingProgress_Previews: PreviewProvider { static var previews: some View { Group { GroupBuyingProgress(data: .init( remainingTimeData: .init( remainingTime: "23:59:59" ), groupProgressData: .init( group: .mock( groupRequirement: .mock( lowerLimitUserCount: 2 ), currentCompletedPurchaseCount: 1 ) ) )) .previewLayout(.sizeThatFits) GroupBuyingProgress(data: .init( remainingTimeData: .init( remainingTime: "23:59:59" ), groupProgressData: .init( group: .mock( groupRequirement: .mock( lowerLimitUserCount: 10 ), status: .completed, currentCompletedPurchaseCount: 10 ) ) )) .previewLayout(.sizeThatFits) } } } #endif @testable import Kauche import KaucheCoreKit import XCTest class GroupTests: XCTestCase { private var activeGroup: Group! private var expiredGroup: Group! override func setUp() { activeGroup = .active() expiredGroup = .expired() } func testActiveGroupIsExpired_false() { XCTAssertFalse(activeGroup.isExpired) } func testExpiredGroupIsExpired_true() { XCTAssertTrue(expiredGroup.isExpired) } } Previews UnitTests

Slide 23

Slide 23 text

© KAUCHE, Inc. Dependency

Slide 24

Slide 24 text

© KAUCHE, Inc. Dependency ● モックデータは Unit Tests や Xcode Previews など開発用に定義し、使用する想定 ● 開発アプリ Target のみにリンクさせる ● 本番アプリ Target にはリンクしない

Slide 25

Slide 25 text

© KAUCHE, Inc. Link KaucheMockKit

Slide 26

Slide 26 text

© KAUCHE, Inc. まとめ

Slide 27

Slide 27 text

© KAUCHE, Inc. まとめ ● シェア買いアプリ「カウシェ」の Multi Modules 導入状況を共有しました ● Unit Tests / Xcode Preview で使用しているモックデータ定義が重複してしまうという課題 に対して、KaucheMockKit を作成しモックデータを集約しました ● KaucheMockKit の中身やリンクに関してお話しました

Slide 28

Slide 28 text

© KAUCHE, Inc. #kauche_techtalk カウシェ、絶賛採用募集中です! 急成長中のECスタートアップで活躍したい仲間求む! エンジニア求人💁‍‍

Slide 29

Slide 29 text

© KAUCHE, Inc. https://enjoy-working.kauche.com/product