iOSのUIテストQAず開発の友情を信じる必芁があるが、自分をflatめない理由







最近、iOSでのiFunnyのUIテストの実装を取り䞊げたした。 この道は厄介で、長く、党䜓論的です。 それでも、私はこの方向ぞの私の最初のステップを賢い人々ず共有したいず思っおいたす。 私たちは真実であるふりをしたせん-圌らは圌ら自身の補品にすべおを詊みたした。 そのため、猫の䞋には、iOSでiFunnyが䜕であるか、およびUIずツヌルずコヌドサンプルに関する倚くのフィヌドバックが必芁な理由に぀いおの少しの情報がありたす。



iOSのiFunnyずは



iFunnyは、ナヌモアずミヌムに関するアメリカのアプリケヌションで人気があり、毎月1,000䞇人が芖聎しおいたす。 ここですべおがどのように始たったかに぀いおもっず読むこずができたす 。 iOSでのアプリケヌション開発は6幎前に開始されたしたが、革新的な圱響はありたせん。





単䜓テスト







私たちはすべおを他の方法で回避しおいたす働くずいうこずはミヌムを芋るずいうこずです:)



ビゞネスロゞックず回避策の重芁な瞬間に䜿甚する単䜓テスト。 これは非垞に簡単なテストです。モデルのメ゜ッドをテストし、新しいコンテンツの受信をチェックしたす。



- (void)testIsNewFeaturedSetForContentArrayFalse { FNContentFeedDataSource *feedDataSource = [FNContentFeedDataSource new]; NSMutableArray *insertArray = [NSMutableArray arrayWithArray:[self baseContentArray]]; feedDataSource.currentSessionCID = @"0"; BOOL result = [feedDataSource isNewFeaturedSetForContentArray:insertArray]; XCTAssertFalse(result, @"cid check assert"); feedDataSource.currentSessionCID = @"777"; result = [feedDataSource isNewFeaturedSetForContentArray:insertArray]; XCTAssertTrue(result, @"cid check assert"); }
      
      





䜿甚するテストの2番目のクラスは、クラスをオヌバヌラむドするためのルヌルをチェックするために必芁なテストです。 ある時点で、䞀連の静的メ゜ッドが異なる、分析システム甚の同じタむプのクラスを倚数蚘述する必芁がありたした。



XcodeずObjective-Cは、誀っお蚘述されたコヌドから保護するための゜リュヌションを提䟛したせんでした。

したがっお、このテストを䜜成したした。



 - (void)testAllAnalyticParametersClasses { NSArray *parameterClasses = [FNTestUtils classesForClassesOfType:[FNAnalyticParameter class]]; for (Class parameterClass in parameterClasses) { FNAnalyticParameter *parameter = [parameterClass value:@"TEST_VALUE"]; XCTAssertNotNil(((FNAnalyticParameter *)parameter).key); XCTAssertNotNil(((FNAnalyticParameter *)parameter).dictionary); } }
      
      







ここでは、クラスに2぀の静的メ゜ッド、キヌずディクショナリが含たれおいるこずを確認したす。これらは、むベントを分析システムに正しく送信するために必芁です。



UIテスト



UI芁玠の操䜜方法に぀いおはすでに十分に研究しおおり、Android向けのテストを䜜成する際のテスト環境に぀いおも怜蚎しおいたす。 次のような結果になりたした。





新しいバヌゞョンを開発し、すべおが萜ち着くのを埅っおいたため、ストリヌムに远加できたせんでした。 珟圚、テストベヌスの埩元ず開発を積極的に行っおいたす。



iOSの転換期が到来したした。QAチヌムずiOS開発者は、再び集たっお、なぜ自動テストが必芁なのかを議論するこずから始めたした。 それは重芁な儀匏であり、マントラのように振る舞いたした。





ツヌル



私たちはツヌルの遞択から始めたした。 議題には3぀の䞻芁なフレヌムワヌクがあり、珟圚ではモバむルアプリケヌションのテストに最もよく䜿甚されおいたす。 それぞれを詊しおみたした。









Appiumは人気のあるクロスプラットフォヌムフレヌムワヌクです。 近い将来、モバむルアプリケヌションをテストする際の暙準になるず考えられおいたす。 数ヶ月前、iOS 10が半幎リリヌスされたのでテストするこずにしたしたが、少し動揺したしたサポヌト付きのAppiumのバヌゞョンはベヌタ版であり、補品版では䞍安定なバヌゞョンを䜿甚したくありたせんでした。 Androidで実行されるAppium Inspectorを䜿甚できたせんでした。Xcode8ずiOS 10のサポヌトはありたせんでした。すぐに安定バヌゞョンをリリヌスしたしたが、軞を曎新しおから6か月埅぀こずは非垞に望たしくありたせん。 私たちは自分自身やAppiumを苊しめないこずにしたした。









Calabashはクロスプラットフォヌムのオヌプン゜ヌス゜リュヌションであり、テストの䜜成にBDDアプロヌチを䜿甚し、最近たでXamarinでサポヌトされおいたした。 最近、開発者はサポヌトがすべおだず蚀った。 たた、これ以䞊進たないこずにしたした。









そしお最埌に、 XCTestは最終的に遞択したAppleのネむティブフレヌムワヌクです。 したがっお、長所に぀いお読んでください





次に、AppleのネむティブツヌルRecorderを怜蚎したした。これは、実際のテストを䜜成するずきに䜿甚されるこずを期埅せずに、補助ツヌルずしお䜍眮付けられおいたす。 これを䜿甚するず、UI芁玠のラベルを調べお、基本的なゞェスチャヌをいじるこずができたす。 開発䞭に行われなかった堎合、Recoderはコヌド自䜓を蚘述し、オブゞェクトぞのポむンタヌを生成したす。 これが唯䞀の利点です。 さらに倚くのマむナスがありたした





開発者は急いで支揎する



次に、実際に発生した問題に぀いお説明したす。開発に関䞎するこずでそれらを解決したす。



ブラックボックス









ブラックボックスのプラスはマむナスに倉わりたす。デバむスたたはシミュレヌタヌ䞊のアプリケヌションの珟圚の状態を知るこずはできたせん。 それをリセットし、Androidず同様に、どの囜で、どのナヌザヌずやり取りしたいかをアプリケヌションに通知する特定の環境を䜜成する必芁がありたす。 これはすべお、アプリケヌションの起動蚭定を䜿甚しお解決されたす。



Xcodeの事前アクションも必芁でした。 各テストの前に䜜業環境をリセットするために、むンストヌルされたアプリケヌションをシミュレヌタヌから削陀しお、ナヌザヌ蚭定ずサンドボックスに保存されおいるすべおのものをリセットするこずにしたした。



 xcrun simctl uninstall booted ${PRODUCT_BUNDLE_IDENTIFIER}
      
      





環境倉数では、次のように動䜜したす。



 app = [[XCUIApplication alloc] init]; app.launchEnvironment = @{ testEnviromentUserToken : @"", testEnviromentDeviceID : @"", testEnviromentCountry : @"" }; app.launchArguments = @[testArgumentNotClearStart];
      
      





テストでは、アプリケヌションオブゞェクトが䜜成され、アプリケヌションに転送する必芁がある蚭定を持぀ディクショナリたたは配列がlaunchEnviromentおよびlaunchArgumentsフィヌルドに曞き蟌たれたす。 アプリケヌションでは、蚭定ず匕数はメ゜ッドのアプリケヌションの最初のデリゲヌトで読み蟌たれたす。



 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      
      





したがっお、凊理を行いたす。



 NSProcessInfo *processInfo = [NSProcessInfo processInfo]; [FNTestAPIEnviromentHandler handleArguments:processInfo.arguments enviroment:processInfo.environment];
      
      





TestAPIEnvHandlerクラスは、構成蟞曞ず匕数の配列の凊理を実装したす。



アむテムのプロパティ



UIのestで䜜業を始めたずき、問題がありたした。暙準のツヌルセットではフォントず色の読み取りが蚱可されおいたせん。



芁玠のゞェスチャのみを䜿甚できたすが、芁玠に蚘述されたテキストを読み取ったり、その䜍眮やUIテストに興味深いその他のプロパティを取埗したりするこずはできたせん。



代替゜リュヌションを怜玢した埌、UIテストが機胜するAccessibility APIに泚目したした。



テストずアプリケヌション間の「橋」ずしお、accessibilityValueを䜿甚するこずにしたした。これは、iOS SDKのすべおの可芖芁玠にありたす。



自転車が行き、次の決定が刀明したした。



  1. accessibilityValueに、json文字列を蚘述したす。
  2. テストでは、読み取りずデコヌドを行いたす。
  3. UI芁玠の堎合、テストで必芁なフィヌルドのセットを定矩するカテゎリを䜜成したす。


UIButtonの䟋を次に瀺したす。



 @implementation UIButton (TestApi) - (NSString *)accessibilityValue { NSMutableDictionary *result = [NSMutableDictionary new]; UIColor *titleColor = [self titleColorForState:UIControlStateNormal]; CGColorRef cgColor = titleColor.CGColor; CIColor *ciColor = [CIColor colorWithCGColor:cgColor]; NSString *colorString = ciColor.stringRepresentation; if (titleColor) { [result setObject:colorString forKey:testKeyTextColor]; } return [FNTestAPIParametersParser encodeDictionary:result]; } @end
      
      





テストでaccessibilityValueを読み取るには、アクセスする必芁がありたす;このため、各XCUElementオブゞェクトには倀フィヌルドがありたす。



 XCUIElement *button = app.buttons[@"FeedSmile"]; NSData *stringData = [button.value dataUsingEncoding:NSUTF8StringEncoding]; NSError *error; NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:stringData options:0 error:&error];
      
      





ナヌザヌむンタラクション



ゞェスチャずアクションの問題は解決されたした芋よツヌル自䜓によっお、タップ、ダブルタップなどの暙準的な方法の倧きなセットのおかげです。 しかし、このアプリケヌションには、暙準だけでなく、非垞に重芁なものもありたす。 たずえば、トリプルタップでは、すべおの軞に沿っお異なる方向にスワむプしたす。 これを解決するために、パラメヌタヌを構成するのず同じ暙準的な方法を䜿甚したした。 これは倧きな砎片ではありたせんでした。



アプロヌチを䜿甚した簡単なテストの䟋









 - (void)testExample { XCUIElement *feedElement = app.otherElements[@"FeedContentItem"]; XCTAssertNotNil(feedElement); XCUIElement *button = app.buttons[@"FeedSmile"]; [button tap]; [[[[XCUIApplication alloc] init].otherElements[@"FeedContentItem"].scrollViews childrenMatchingType:XCUIElementTypeImage].element tap]; NSDictionary *result = [FNTestAPIParametersParser decodeString:button.value]; CIColor *color = [CIColor colorWithString:result[testKeyTextColor]]; XCTAssertFalse(color.red - 1.f < FLT_EPSILON && color.green - 0.76f < FLT_EPSILON && color.blue - 0.29f < FLT_EPSILON, @"Color not valid"); XCUIElement *feed = app.scrollViews[@"FeedContentFeed"]; [feed swipeLeft]; [feed swipeLeft]; [feed swipeLeft]; }
      
      





完党なテストカバレッゞを行う予定はなかったため、ここで実隓が終了したした。 プロセスで自動テストを完党に実装するこずを決定した堎合、XCtestを䜿甚するこずが明らかになりたしたが、これを継続的に実行するこずは非垞に困難です。 理由は次のずおりです。





PSプレビュヌを撮圱するずき、単䞀のバグが傷぀かなかった。 Semyonは匕き続きQAチヌムを刺激したす。










All Articles