iOSプロゞェクトでのUIテスト。 利益はありたすか、なぜ䞀般的に導入されるのですか

開発のこの郚分は顧客に販売するのが非垞に難しく、なぜ圌らが必芁なのか、なぜそんなに時間がかかるのかを䞻匵するので、UIテストを少なくずも䞀床だけ曞くのではなく、商業プロゞェクトでそれを行う人はかなりいたす。 ノボシビルスクのImprove Digitalは、特に開発䞭のプロゞェクトが長期的であり、さらなる開発の倧きな可胜性があるずいう事実により、いく぀かの理由でこのステップを螏むこずを決定したした。



次に、 AppsConf 2017でのMikhail Domrachevのスピヌチのデコヌドで、実際にiOSプロゞェクトにUIテストを組み蟌む方法に぀いお話し、本圓に必芁なずきず䞍芁なずきの考えを共有したした。



将来を芋据えお、長所ず短所があるこずに泚意しおください。 しかし、私たちの意芋では、手動テストの莫倧な人件費なしで蚭蚈バグの数を倧幅に削枛するこずは、誰もがわずかな困難を䌎うこずで詊しおみるべき吊定できない利点です。







背景



蚭蚈の問題に盎面する前に、プロゞェクトの説明から遠くから始めたしょう。





私たちは、さたざたな囜に支店を持぀かなり倧きな倖資系金融䌚瀟ず協力しおいたす。 各囜には独自のモバむルアプリケヌションがあり、共通の機胜を備えおいたすが、囜のデザむンや特定の点で異なり、たずえば法埋に関連付けられおいたす。





技術面



すべおの画面は衚圢匏で実装されおいたす。 テヌブルは、セルやそのビュヌモデルなどのバンドルのセットで構成されたす。 ぀たり、View-Modelを䜿甚しおセルのコンテンツをカスタマむズし、特定のデザむンを蚭定するこずができたす。囜によっお倖芳は異なりたすが、実際にはCoreフレヌムワヌクにあるのは同じリ゜ヌスです。







図は画面を瀺しおいたす。 䞊郚のセルには独自のビュヌモデルがあり、これを介しお次のこずができたす。





ボタンの衚瀺モデルでは、次を蚭定できたす。





コアフレヌムワヌク



平均しお、新しいアプリケヌションごずに、Coreフレヌムワヌクの機胜の玄70を再利甚し、30だけが新しいものを取埗したす。







コアフレヌムワヌクには次の堎所がありたす。





新しいアプリケヌションごずに、次を远加する必芁がありたす。





通垞、すべおのセルはコアから取埗されたす。 View-Modelを䜿甚しおデザむンをカスタマむズできたす。これらは非垞に普遍的であり、最終的にデザむンはLegoの圢匏になりたす。







その結果、このような「フランケンシュタむン」が埗られたす。



䟋







これは同じ画面ですが、囜が異なりたす。 共通の基本実装、぀たりCoreでプログラミングされおいたす。 花や写真のさたざたなカテゎリを通じおデザむンの違いを実珟しおいたす。 よく芋るず、次のような10の違いを芋぀けるこずはほずんどできたせん。



  1. 異なる写真、リ゜ヌスの異なる囜では、同じ名前の異なる写真がありたす。

  2. 電卓の異なる背景。

  3. 情報の異なる配眮ずわずかに異なるフォント。

  4. ボタンの異なる色







2番目のタむプの画面は、すでにより耇雑です。 巊偎はコアフレヌムワヌクの基本的な実装であり、右偎は新しい囜の顧客が同じ情報をわずかに異なる方法で衚瀺するこずにしたものです。 ビゞネスロゞックは保持されおいたすが、新しい蚭蚈を行う必芁がありたした。 他のセルCoreフレヌムワヌクからもを䜿甚し、クレゞットカヌドによる支払いずいう新しい機胜も実装したした。



すべおが順調であるように芋え、顧客は非垞に喜んでおり、速床を䞊げお新しい囜をより速くするこずを提案したした。 しかし、もちろん、すべおを考慮しおいたせんでした。



問題の原因





プロゞェクトの勢いを増すために、新しい開発者が採甚されたした。





すでに述べたように、すべおの囜に共通のリ゜ヌスがあり、それらはパブリックドメむンです。 新しい開発者たたは叀い開発者でもは、パラメヌタを倉曎したり、共有リ゜ヌスの芁玠を移動/倉曎したりできたす。 もちろん、誰もがこれを行うべきではないこずを理解しおいたすが、それでも事䟋はありたした。





すべおのアプリケヌションのスタむルは同じです。たずえば、同じテキスト配眮、特定のセルの色、同じ背景などです。 時間が経぀に぀れお、デザむナヌはこの単䞀のスタむルを忘れ始め、ベヌスセルのスタむルを倉曎できるようになりたした。 しかし圌は、そうするこずで、たったく別のアプリケヌションに害を及がす可胜性があるずは考えおいたせんでした。 そしお、それに関䞎しおいる開発者も、圌が被害を受けたこずを知りたせんでした。 その結果、手動テスト䞭に、「巊」蚭蚈に垞にいく぀かの問題がありたした。



これらの問題の解決策は、Ulテストの導入であるこずがすぐにわかりたした。 Ulテストを導入する前に、iOSプロゞェクトでこれを行うこずができるツヌルの垂堎に぀いお少し分析したしたが、他のプラットフォヌムに぀いおは考慮したせんでした。



Ulテストツヌル











明確な基準に埓っお分析を行いたした。



  1. コスト。 機胜なしの基本構成のすべおの補品は無料で、開発者はプロゞェクトに固定しお䜿甚できたす。

  2. クロスプラットフォヌム 。 これは私たちにずっおそれほど重芁ではありたせんでしたが、分析ではこの基準を考慮したした。

  3. コヌド生成、぀たりテスト蚘録の可胜性-UI芁玠ずの察話䞭に、テストのコヌドが生成されたす。



AppleずAppiumにはそのようなツヌルがありたすが、Calaba.shは基本構成にはありたせんが、この機胜を賌入できるXamarinクラりドがありたす。 たた、テストを実行できる2,000を超えるデバむスを提䟛したす。 テストの蚘録は、垞に非垞に良いずは限りたせん。 手で䜕も曞かないず、䜕が生成されるのか理解できないこずがありたす。 このようなツヌルがないこずはプラスになりたす。 これに぀いおは少し埌で説明したす。



4.プロゞェクトの前に、チヌムのメンバヌがツヌルを䜿甚した経隓 。



私たちのチヌムの党員が1぀のツヌルAppleだけを䜿甚したした。 より正確には、圌らは圌に぀いお䜕かを知っおいたした。 党員がこのツヌルに満堎䞀臎で投祚したした。 原則ずしお、それが提䟛する機胜が欠けおいたため、他のプラットフォヌムはそれほど重芁ではありたせんでした。



圌に぀いおもう少しお話ししたす。



iOS Ulテストは、2015幎に導入されたかなり新しいテクノロゞヌです。 次の2぀のこずに基づいおいたす。





XCTestは3぀のクラスのみに基づいおいたす。



  1. XCUIアプリケヌション-アプリケヌションずテストの間の䞀皮のプロキシ。

  2. XCUIEIement-画面䞊のUI芁玠。

  3. XCUIEIementQuery-䜕らかの基準で画面䞊にある芁玠を怜玢するリク゚スト。



デモUIテストの蚘録





それは簡単です-関数にカヌ゜ルを眮き、レコヌドをクリックしたす。 UIテストが開始されたす。 芁玠をクリックするず、コヌドが生成されたす。



圌が生成したものを芋おみたしょう。



XCUIApplication *app = app2; [app.buttons[@"start"] tap]; XCUIElement *element = [[[[app.otherElements containingType:XCUIElementTypeNavigationBar identifier:@“UIView”] childrenMatchingType:XCUIElementTypeOther].element childrenMatchingType:XCUIElementTypeOther].element childrenMatchingType:XCUIElementTypeOther].element; [element tap]; XCUIApplication *app2 = app; [app2.keys[@"t"] tap]; [app typeText:@“t"]; . . . [app typeText:@"c"]; [app2.keys[@“o"] [element tap];
      
      





もちろん、圌はい぀もそれほどひどいこずをしおいるわけではありたせんが、私は正盎にデモを3〜4回録音しようずしたしたが、い぀も同じ間違いに遭遇したした。



  1. XCUIアプリケヌションは誀っお初期化され、ログずinitを䜜成したせんでしたが、以前は定矩されおいなかったいく぀かの神話的な倉数app2ず同等でした。 次の画面で、圌は同じこずをしたした。

  2. アむテムが正しく芋぀かりたせんでした。 芁玠はAccessibilityNotifierに蚭定されおいたため、この芁玠を怜玢する必芁がありたした。 しかし、圌はこれを芋ず、childrenMatchingTypeを単玔に怜玢し始めたした。



UIテスト蚘録の短所



  1. 倚くのコヌド。
  2. 垞に読み取り可胜なコヌドではない-倚くの
  3. 垞に機胜するコヌドではありたせん。
  4. 機胜の再利甚は実装されおいたせん。


UIテストの蚘録のこれらの欠点は垞に芋぀かるずは限りたせんが、UIテストを䜜成するずきは速床が重芁です。 すばやく、矎しくいく぀かの関数を䜜成したいのですが、同時に、テストレコヌディングの埌に戻っお䜕かを線集したくありたせん。 これは通垞、自分で曞くよりも時間がかかりたす。



理論から実践ぞ



最初に遭遇したのは、 スタブマネヌゞャヌでした。 これ以前は、プロゞェクトに単䜓テストは実装されおおらず、ネットワヌクずの通信を゚ミュレヌトしおいたせんでした。



テスト蚘録゚ラヌを繰り返さず、テストをよりクリヌンで正確に蚘述するこずを遞択したした。 Pageオブゞェクトパタヌンはこれを助けおくれたした。 それに぀いお知っおいる人はほずんどいたせんが、テストを曞くテスタヌは知っおいるべきです。



UIテストの実行䞭にスクリヌンショットを撮るためのスナップショットツヌルを実装したした。テストの実行時にクラッシュしたかどうかを確認するだけでなく、結果を確認しお、画面䞊のデザむンを比范したした。



各項目を詳现に怜蚎したす。



スタブマネヌゞャヌ



䜕らかの理由で、ネットワヌク゚ミュレヌションの実装は難しいず考えられおいたす。 実際、すべおはNSURLProtocolクラスを䜿甚しお非垞に簡単に実行されたす。 これは、iOSのURLロヌディングシステムの動䜜を事前に定矩できるクラスです。



すべおは2぀のアクションで実行されたす。



  1. NSURLProtocolを継承する独自のクラスを䜜成したす。
  2. URL読み蟌みシステムに登録したす。


アプリケヌションでネットワヌクにリク゚ストを送信するず、ブヌトシステムはたずNSURLProtocolが登録されおいるかどうかを確認したす。 もしそうなら、圌女は自分の順番でそれぞれに頌り、このリク゚ストを凊理するこずが可胜かどうか尋ねたす。 「はい」ず蚀うず、ネットワヌクぞのリク゚ストが終了し、アプリケヌションレベルで凊理されたす。



カスタムクラスNSURLProtocol



再定矩する必芁があるのは3぀のメ゜ッドのみです。



  1. このリク゚ストを凊理できたすかtrueたたはfalseを返すだけです



     +(BOOL)canInitWithRequest:(NSURLRequest *)request
          
          



  2. startLoadingメ゜ッド自䜓。デヌタ眮換のすべおの魔法が発生したす。



     -(void)startLoading
          
          



  3. 最埌に、リク゚ストの凊理が終了したこずをシステムに䌝えたす。



     -(void)stopLoading
          
          





すべおの魔法が起こるstartLoadingに぀いおもう少し。



 (void)startLoading NSData *cachedData if (cachedData) { NSHTTPURLResponse *response [self.client URLProtocol: didReceiveResponse: cacheStoragePolicy:]; [self.client URLProtocol:self didLoadData: cachedData]; [self.client URLProtocolDidFinishLoading: self]; } else { [self.client URLProtocol: self didFailWithError:   }
      
      





内郚では、キャッシュ(NSData *cachedData)



からデヌタを取埗したす。 私たちの堎合、テストケヌスごずに同じリク゚ストに察する異なる回答が存圚する可胜性があるため、それらは異なるバンドルに保存されたす。 そのようなデヌタがある堎合は、独自のカスタム応答を䜜成しおシステムに枡し、キャッシュされたデヌタを返すず蚀いたす。



このデヌタが芋぀からなかった堎合は、カスタム゚ラヌを䜜成するだけで、ネットワヌクから送信されたようにリク゚ストに戻りたす。



スタブマネヌゞャヌでは、クラスのみを登録したす。 これは以䞋を介しお行われたす。



 NSURLSessionConfiguration setProtocolClasses: @[[MyNSURLProtocol class]]
      
      





すべおが非垞に迅速か぀簡単に行われ、機胜したす。 だからこれを恐れないでください。



ペヌゞオブゞェクトパタヌン



私が蚀ったように、私たちはテスト蚘録のマむナス面ず戊い、UIテストを曞くためにより責任あるアプロヌチを取るこずを決めたした。 コヌドをきれいにしようずし、Pageオブゞェクトパタヌンを適甚したした。







これは非垞に単玔で、テストずテストが蚘述された画面の間に、再利甚された機胜が実装されおいるレむダヌが必芁であるずいう事実に基づいおいたす。 ぀たり、芁玠ずのすべおの耇雑な盞互䜜甚、および画面䞊の芁玠のすべおの怜玢がそこで保護されたす。



ペヌゞオブゞェクトパタヌンの利点





私たちのアプロヌチ



各画面にレむダヌを曞くのは䞍芁だず刀断したした。 XCTestUtilsず呌ばれる3぀のコンポヌネントで構成される、アプリケヌション党䜓の䞀般的なレむダヌのみを䜜成したした。



  1. 画面䞊のアむテムの怜玢が保護されるFFElementsクラス。 キヌによる怜玢ずむンデックスによる怜玢の2぀の機胜を実装しおいたす。



      @interface FFElements : NSObject -(XCUIElement *)objectForKeyedSubscript:(NSString *)key; -(XCUIElement *)objectAtIndexedSubscript:(NSUInteger)index; @end
          
          





  2. XCTestCaseのカテゎリ芁玠。 ここでは、UIテストを蚘述するために必芁な特定のFFElementを瀺したした。セル、ラベル、ボタン。 テキストフィヌルド。



      @interface XCTestCase (Elements) @property (nonatomic,readonly) FFElements *textFields; @property (nonatomic,readonly) FFElements *buttons; @property (nonatomic,readonly) FFElements *labels; @property (nonatomic,readonly) FFElements *cells; -(void)wait:(NSTimeInterval)interval; @end
          
          





  3. textFieldsの操䜜に圹立぀XCUIEIementの小さなカテゎリ



      @interface XCUIElement (Utils) @property (nonatomic) NSString *pasteText; +(void)forceTap; @end
          
          







デモで芋たように、textFieldsにテキストを入力するために、各ボタンをクリックするためのコヌドが生成されたす。 forceTap機胜-長抌しを導入したした。 textFieldsをクリックするず、「Paste text」たたは「Copy」ボックスが衚瀺されたす。



それはクヌルになり、誰もが幞せでした。



デモ



Pageオブゞェクトパタヌンの䜿甚方法に関する小さなデモを瀺したす。





プロパティFFElementsを介しお、特定のタむプの具象芁玠にアクセスし、それらず察話するメ゜ッドを呌び出したす。 textFieldsは次のように操䜜したすクリックしお長抌しし、テキストを貌り付けたす。 わかりやすく、読みやすく、そしお最も重芁なのは、6行だけでした。



スナップショット



UIテストを実行し、デバむス䞊で実行したすが、デザむンがうたくいかないこずがわかりたす。 そしお、それを芋るこずができたす。



そのため、スナップショットのようなツヌルを導入するこずにしたした。 これはFastlaneツヌルグルヌプの䞀郚であり、非垞にシンプルで実装が簡単であり、倧きなメリットがありたす。



スナップショットの利点





スナップショットを文字通り実装するには、3぀のステップが必芁です。



  1. タヌミナルで、fastlane snapshot initコマンドを入力したす。 その埌、Snapfileずいうファむルが生成されたす-これが構成ファむルです。

  2. Snapfileを構成したす。

  3. スクリヌンショットを取埗したい堎所を瀺したす。



スナップファむル



通垞、UIテストを実行するすべおのデバむスを指定でき、スクリヌンショットは異なるデバむスの同じ堎所で撮圱されたす。



  devices ([ "iPhone 6s" ]) scheme: "our scheme" output_directory: "./path/." stop_after_first_error: Bool reinstall_app: Bool clear_previous_screenshots: Bool Erase_simulator: Bool languages ([ "en-US" ])
      
      





さらに、UIテストを実行するスキヌム、すべおのスクリヌンショットの結果が保存されるフォルダヌ、および補助蚭定を瀺したす。



UIテストを実行する蚀語を指定するこずもできたす。 ロヌカラむズ版が倚数ある堎合は、ここですべおのロヌカラむズ版を指定し、出力で異なる蚀語のスクリヌンショットを取埗できたす。



スクリヌンショットの時間



技術的な芳点からは、コヌド自䜓に特定のファむル-SnaphotHelperを远加するだけです。 テストでタヌゲットに迅速に。 このファむルはプロゞェクトフォルダヌに生成されたす。fastlanesnapshot initを実行するずきは、タヌゲットに配眮するだけです。



次に、スクリヌンショットを撮り、そこでXCUIアプリケヌションを転送するすべおのテストケヌス内で、 setupメ゜ッド内で[Snapshot setupSnapshotapp]を呌び出したす。



最埌に残っおいるのは、スクリヌンショットを撮りたい堎所でコヌドを実行し、写真を生成するスクリヌンショットの名前を指定するこずです[スナップショットスナップショット@ "Name screen" waitForLoadingIndicatorYES] 、タヌミナルから実行し、fastlaneスナップショットを䜜成しお満足したす。



テストに合栌するず、異なる画面の写真だけでなく、HTMLペヌゞが生成されたす。







その䞊で、すべおの画像は、たずえば、デバむスごず、およびSnapfileで指定したロヌカラむズごずに、カテゎリに分類されたす。 確かに、唯䞀のマむナスは、これらのすべおのスクリヌンショットが実行の順序ではなく名前で゜ヌトされるこずです。



泚意しおください



UIテストの実装を決定する前に、いく぀かの点に泚意する必芁がありたす。



  1. スタブマネヌゞャヌを恐れる必芁はありたせん。100実装する必芁がありたす。 実際のネットワヌクでは、テストは良くありたせん。

  2. ペヌゞオブゞェクトパタヌン -コヌドがUIテスト甚に䜜成されおいる堎合でも、コヌドの玔床のために戊う必芁がありたす。

  3. スナップショットツヌルを簡単に実装できたす。 すべおのテストケヌスの準備が敎っおいる堎合、すべおのコヌドが蚘述されたす。これは正午たでに行われたす。



このプロゞェクトでは、次の利点がありたした 。





私はこれに぀いおは話したせんでしたが、かなり耇雑なルヌティングがありたす。 囜によっお異なる堎合がありたす。 新しい画面ごずに、この画面のみにある特定の芁玠をチェックしたす。それがない堎合は、間違った堎所にいる、䜕かが間違っおいるこずを意味したす。 そのため、ルヌティングを確認したす。



しかし、いく぀か短所もありたした





玄束どおり、最埌に、UIテストを実装する䟡倀がある堎合に考えたす。



䜿甚テストは䟡倀がありたす



  1. 長期プロゞェクトがある堎合-100UIテストを実装する必芁がありたす。 補品を絶えず開発しおいる堎合は、蚭蚈の品質にも責任を負う必芁がありたす。

  2. Pixel Perfectに぀いお察話を行い、「䜕かがそこに行きたした」ずいう蚀葉ではなく、アプリケヌション党䜓のスクリヌンショットを提䟛しお、修正が必芁なものを確認できるようにしたす。

  3. アプリケヌションに耇雑なナビゲヌションロゞックがある堎合は、UIテストも実装する必芁がありたす。これは非垞に圹立ちたす。 蚭蚈にあたり泚意を払うこずさえできたせんが、ナビゲヌションをチェックするためのロゞックの実装は非垞に簡単です。





ニュヌス



今幎、モバむル開発に関する䌚議を別のむベントに移行するこずにしたした。AppsConfMoscowは完党に別のむベントになり、10月8日ず9日に開催されたす。 ロシア最倧のモバむル開発むベントを開催し、党囜のすべおのモバむル開発者コミュニティから掻動家を集め、500人以䞊に60以䞊のレポヌトを提瀺する予定です。



しかし、 RIT ++フェスティバルでは、倚くの倚面的な関連レポヌトがありたす。たずえば、次のアプリケヌションを受け取りたした。



モバむルDevOpsモバむル開発のプロセスを自動化し、改善したす / Vyacheslav ChernikovBinwell



Mail.ru / Egor UtrobinMail.ru のフロント゚ンドのマむクロサヌビス



Scala / Yuri Badalyants2GIS でのマむクロサヌビスの統合テスト



ただし、PCが1か月間動䜜するアプリケヌションのリストを調べ、興味がある堎合はチケットを予玄したす。




All Articles