{"id":17986,"date":"2016-12-30T00:00:26","date_gmt":"2016-12-30T00:00:26","guid":{"rendered":"https:\/\/www.fullcontact.com\/?p=17986"},"modified":"2022-04-05T08:34:23","modified_gmt":"2022-04-05T14:34:23","slug":"chaos-testing-our-mobile-apps-at-fullcontact","status":"publish","type":"post","link":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/","title":{"rendered":"Chaos Testing our Mobile Apps at FullContact"},"content":{"rendered":"<p id=\"e449\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia dj\" data-selectable-paragraph=\"\">Let&#8217;s have a bit of a straight talk \u2014 chances are your app isn\u2019t tested nearly as well as you\u2019d want it to be. And neither is ours. There are a lot of ways to get to this point and a lot of articles covering them so let\u2019s skip this part and focus on making the situation better instead.<\/p>\n<p id=\"6657\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia dj\" data-selectable-paragraph=\"\">So how can we fix that? Well, the obvious answer is \u2014 slowly. When you make changes to some part of the codebase \u2014 write a test for them. Maybe introduce a new architecture pattern to make the code more testable (we are fans of <a class=\"ew fu hj hk hl hm\" href=\"https:\/\/8thlight.com\/blog\/uncle-bob\/2012\/08\/13\/the-clean-architecture.html\" target=\"_blank\" rel=\"noopener noreferrer\">Clean Architecture<\/a> ourselves).<\/p>\n<p id=\"2744\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia dj\" data-selectable-paragraph=\"\">But in the meantime \u2014 your app is in production. It is complex. It doesn\u2019t wait. It sometimes fails for weird reasons. Networks are flakey. You have a bunch of interdependent network calls. HELP!<\/p>\n<h2 id=\"d69f\" class=\"ib ic ck bg as at ds id du ie if ig ih ii ij ik il\">Chaos Testing<\/h2>\n<p id=\"0b23\" class=\"hn ho ck bg hp b hq im hs in hu io hw ip hy iq ia dj\" data-selectable-paragraph=\"\"><a class=\"ew fu hj hk hl hm\" href=\"https:\/\/www.boyter.org\/2016\/07\/chaos-testing-engineering\/\" target=\"_blank\" rel=\"noopener noreferrer\">Chaos testing<\/a> is basically causing systems to fail in a controlled manner to see how the failures impact your solution as a whole. The term was coined by the good folks at Netflix who&#8217;ve had great success testing the stability of their services using <a class=\"ew fu hj hk hl hm\" href=\"https:\/\/github.com\/netflix\/chaosmonkey\" target=\"_blank\" rel=\"noopener noreferrer\">Chaos Monkey<\/a>. And while this has been applied very successfully with backend service testing, there hasn\u2019t been much talk around chaos testing mobile apps, except for the UI automation and testing tools like <a class=\"ew fu hj hk hl hm\" href=\"https:\/\/developer.android.com\/studio\/test\/monkey.html\" target=\"_blank\" rel=\"noopener noreferrer\">Application Exerciser Monkey<\/a> for Android or <a class=\"ew fu hj hk hl hm\" href=\"https:\/\/github.com\/jonathanpenn\/ui-auto-monkey\" target=\"_blank\" rel=\"noopener noreferrer\">UI AutoMonkey<\/a> for iOS.<\/p>\n<p id=\"1ec4\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia dj\" data-selectable-paragraph=\"\">Since our mobile apps here at <a class=\"ew fu hj hk hl hm\" href=\"https:\/\/www.fullcontact.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">FullContact<\/a> do a lot of network calls while synchronising your contacts, we rely heavily on chains of network requests to make sure that everything syncs nicely and without race conditions (<a class=\"ew fu hj hk hl hm\" href=\"http:\/\/reactivex.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">RxJava and RxSwift<\/a> are VERY handy in that respect). So the question becomes \u2014 what happens when a network call in the middle of a request chain fails? Maybe it doesn\u2019t fail completely, just partially. Maybe it causes some unforeseen issues in a completely unrelated part of your app!<\/p>\n<p id=\"380f\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia dj\" data-selectable-paragraph=\"\">The way we approached this ourselves was to gather our Android and iOS teams in the same room, change the API url\u2019s to another dev\u2019s computer, which was running our chaos testing tool <a class=\"ew fu hj hk hl hm\" href=\"https:\/\/github.com\/fullcontact\/proxinius\" target=\"_blank\" rel=\"noopener noreferrer\">Proxinius<\/a> on it, and then observe what happened when we purposely mess up an endpoint or two.<\/p>\n<figure class=\"gj gk gl gm gn gi da db paragraph-image\">\n<div class=\"da db ir\">\n<div class=\"gx r gq gy\">\n<div class=\"is r\">\n<div class=\"gs gt s t u gu ai aw gv gw\"><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"mq ry s t u gu ai hd\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/max\/500\/1*jZIplari1WUuPnaD6nYABA.gif\" width=\"250\" height=\"275\" \/><br \/>\nProxinius is angry and will not let your requests pass!<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/figure>\n<section class=\"dj dk dl dm dn\">\n<div class=\"n p\">\n<div class=\"z ab ac ae af do ah ai\">\n<p id=\"6882\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia dj\" data-selectable-paragraph=\"\"><a class=\"ew fu hj hk hl hm\" href=\"https:\/\/github.com\/fullcontact\/proxinius\" target=\"_blank\" rel=\"noopener noreferrer\">Proxinius<\/a> is a Clojure REPL based proxy (it&#8217;s open-source, so go try it out!), which mutates the responses returned from our backend.<\/p>\n<p id=\"f1d8\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia dj\" data-selectable-paragraph=\"\">There are two mutations available right now:<\/p>\n<ul class=\"\">\n<li id=\"209a\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia it iu iv\" data-selectable-paragraph=\"\">Return a 500 HTTP status<\/li>\n<li id=\"4b81\" class=\"hn ho ck bg hp b hq iw hs ix hu iy hw iz hy ja ia it iu iv\" data-selectable-paragraph=\"\">Return an empty response<\/li>\n<\/ul>\n<p id=\"c943\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia dj\" data-selectable-paragraph=\"\">The default mode of operation for Proxinius is to randomly mutate 10% (easily configurable) of requests passing through it. Mutation of random requests is invaluable when you want to test how well your retry policies and recoveries work.<\/p>\n<p id=\"4b66\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia dj\" data-selectable-paragraph=\"\">The beauty of Proxinius partly stems from its <a class=\"ew fu hj hk hl hm\" href=\"http:\/\/clojure.org\/reference\/repl_and_main\" target=\"_blank\" rel=\"noopener noreferrer\">REPL<\/a> nature. Since Clojure allows us to create new functions at runtime, we can come up with crazy (maybe even nonsense) mutations such as:<\/p>\n<ul class=\"\">\n<li id=\"0243\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia it iu iv\" data-selectable-paragraph=\"\">Change our camelCase based JSON responses into <a class=\"ew fu hj hk hl hm\" href=\"https:\/\/en.wikipedia.org\/wiki\/Letter_case#Special_case_styles\" target=\"_blank\" rel=\"noopener noreferrer\">kebab-cased<\/a> responses<\/li>\n<li id=\"e2cc\" class=\"hn ho ck bg hp b hq iw hs ix hu iy hw iz hy ja ia it iu iv\" data-selectable-paragraph=\"\">Return a random response from another, previous request<\/li>\n<li id=\"bf5c\" class=\"hn ho ck bg hp b hq iw hs ix hu iy hw iz hy ja ia it iu iv\" data-selectable-paragraph=\"\">Make requests wait for 3.14 seconds before returning<\/li>\n<\/ul>\n<p id=\"1895\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia dj\" data-selectable-paragraph=\"\">The ability to iterate on available mutations quickly allows us to come up with tests that would be very hard to create without Proxinius.<\/p>\n<\/div>\n<\/div>\n<\/section>\n<hr class=\"jb et au jc jd hg je jf jg jh ji\" \/>\n<p>&nbsp;<\/p>\n<section class=\"dj dk dl dm dn\">\n<div class=\"n p\">\n<div class=\"z ab ac ae af do ah ai\">\n<p id=\"2f6b\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia dj\" data-selectable-paragraph=\"\">Chaos Testing with Proxinius has thus far helped us find a bunch of really nasty edge cases, as well as a number of minor errors and deficiencies in both our Android and iOS apps.<\/p>\n<p id=\"20a7\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia dj\" data-selectable-paragraph=\"\">A word of caution \u2014 using this in a CI environment is probably not a good idea. While the UI Monkeys work well there, they do so because they aren&#8217;t really checking for anything. The only thing they are doing is testing if your app crashes or not. Checking for states with Proxinius would require having various assertions, which would inevitably lead to flaky tests. <a class=\"ew fu hj hk hl hm\" href=\"https:\/\/testing.googleblog.com\/2008\/04\/tott-avoiding-flakey-tests.html\" target=\"_blank\" rel=\"noopener noreferrer\">And nobody likes flaky tests<\/a>.<\/p>\n<p id=\"8a79\" class=\"hn ho ck bg hp b hq hr hs ht hu hv hw hx hy hz ia dj\" data-selectable-paragraph=\"\">In conclusion \u2014 Chaos Testing and tools like Proxinius are not some kind of a panacea or a silver bullet. They are not going to transform your app overnight, but they can be a very valuable tool in your arsenal when trying to make your app more robust and maintainable.<\/p>\n<\/div>\n<\/div>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>Let&#8217;s have a bit of a straight talk \u2014 chances are your app isn\u2019t tested nearly as well as you\u2019d want it to be. And neither is ours. There are a lot of ways to get to this point and a lot of articles covering them so let\u2019s skip this part and focus on making [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_improvement_type_select":"improve_an_existing","_thumb_yes_seoaic":false,"_frame_yes_seoaic":false,"seoaic_generate_description":"","seoaic_improve_instructions_prompt":"","seoaic_rollback_content_improvement":"","seoaic_idea_thumbnail_generator":"","thumbnail_generated":false,"thumbnail_generate_prompt":"","seoaic_article_description":"","seoaic_article_subtitles":[],"footnotes":""},"categories":[656],"tags":[],"class_list":["post-17986","post","type-post","status-publish","format-standard","hentry","category-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.1 (Yoast SEO v27.1.1) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Chaos Testing our Mobile Apps at FullContact | FullContact<\/title>\n<meta name=\"description\" content=\"Let&#039;s have a bit of a straight talk \u2014 chances are your app isn\u2019t tested nearly as well as you\u2019d want it to be. And neither is ours. There are a lot of\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Chaos Testing our Mobile Apps at FullContact\" \/>\n<meta property=\"og:description\" content=\"Let&#039;s have a bit of a straight talk \u2014 chances are your app isn\u2019t tested nearly as well as you\u2019d want it to be. And neither is ours. There are a lot of\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/\" \/>\n<meta property=\"og:site_name\" content=\"FullContact\" \/>\n<meta property=\"article:published_time\" content=\"2016-12-30T00:00:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-04-05T14:34:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/miro.medium.com\/max\/500\/1*jZIplari1WUuPnaD6nYABA.gif\" \/>\n<meta name=\"author\" content=\"FullContact\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@fullcontact\" \/>\n<meta name=\"twitter:site\" content=\"@fullcontact\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"FullContact\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/\"},\"author\":{\"name\":\"FullContact\",\"@id\":\"https:\/\/www.fullcontact.com\/#\/schema\/person\/046a6157300f0577cf0a6122fb63080e\"},\"headline\":\"Chaos Testing our Mobile Apps at FullContact\",\"datePublished\":\"2016-12-30T00:00:26+00:00\",\"dateModified\":\"2022-04-05T14:34:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/\"},\"wordCount\":696,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.fullcontact.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/miro.medium.com\/max\/500\/1*jZIplari1WUuPnaD6nYABA.gif\",\"articleSection\":[\"Engineering\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/\",\"url\":\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/\",\"name\":\"Chaos Testing our Mobile Apps at FullContact | FullContact\",\"isPartOf\":{\"@id\":\"https:\/\/www.fullcontact.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/miro.medium.com\/max\/500\/1*jZIplari1WUuPnaD6nYABA.gif\",\"datePublished\":\"2016-12-30T00:00:26+00:00\",\"dateModified\":\"2022-04-05T14:34:23+00:00\",\"description\":\"Let's have a bit of a straight talk \u2014 chances are your app isn\u2019t tested nearly as well as you\u2019d want it to be. And neither is ours. There are a lot of\",\"breadcrumb\":{\"@id\":\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#primaryimage\",\"url\":\"https:\/\/miro.medium.com\/max\/500\/1*jZIplari1WUuPnaD6nYABA.gif\",\"contentUrl\":\"https:\/\/miro.medium.com\/max\/500\/1*jZIplari1WUuPnaD6nYABA.gif\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.fullcontact.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Chaos Testing our Mobile Apps at FullContact\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.fullcontact.com\/#website\",\"url\":\"https:\/\/www.fullcontact.com\/\",\"name\":\"FullContact\",\"description\":\"Relationships, reimagined.\",\"publisher\":{\"@id\":\"https:\/\/www.fullcontact.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.fullcontact.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.fullcontact.com\/#organization\",\"name\":\"FullContact\",\"url\":\"https:\/\/www.fullcontact.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.fullcontact.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.fullcontact.com\/wp-content\/uploads\/2019\/11\/fc-logo@2x.png\",\"contentUrl\":\"https:\/\/www.fullcontact.com\/wp-content\/uploads\/2019\/11\/fc-logo@2x.png\",\"width\":200,\"height\":38,\"caption\":\"FullContact\"},\"image\":{\"@id\":\"https:\/\/www.fullcontact.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/fullcontact\",\"https:\/\/www.linkedin.com\/company\/fullcontact-inc-\",\"https:\/\/www.youtube.com\/user\/FullContactAPI\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.fullcontact.com\/#\/schema\/person\/046a6157300f0577cf0a6122fb63080e\",\"name\":\"FullContact\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.fullcontact.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b4c9a289323b21a01c3e940f150eb9b8c542587f1abfd8f0e1cc1ffc5e475514?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b4c9a289323b21a01c3e940f150eb9b8c542587f1abfd8f0e1cc1ffc5e475514?s=96&d=mm&r=g\",\"caption\":\"FullContact\"},\"url\":\"https:\/\/www.fullcontact.com\/blog\/author\/user\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Chaos Testing our Mobile Apps at FullContact | FullContact","description":"Let's have a bit of a straight talk \u2014 chances are your app isn\u2019t tested nearly as well as you\u2019d want it to be. And neither is ours. There are a lot of","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/","og_locale":"en_US","og_type":"article","og_title":"Chaos Testing our Mobile Apps at FullContact","og_description":"Let's have a bit of a straight talk \u2014 chances are your app isn\u2019t tested nearly as well as you\u2019d want it to be. And neither is ours. There are a lot of","og_url":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/","og_site_name":"FullContact","article_published_time":"2016-12-30T00:00:26+00:00","article_modified_time":"2022-04-05T14:34:23+00:00","og_image":[{"url":"https:\/\/miro.medium.com\/max\/500\/1*jZIplari1WUuPnaD6nYABA.gif","type":"","width":"","height":""}],"author":"FullContact","twitter_card":"summary_large_image","twitter_creator":"@fullcontact","twitter_site":"@fullcontact","twitter_misc":{"Written by":"FullContact","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#article","isPartOf":{"@id":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/"},"author":{"name":"FullContact","@id":"https:\/\/www.fullcontact.com\/#\/schema\/person\/046a6157300f0577cf0a6122fb63080e"},"headline":"Chaos Testing our Mobile Apps at FullContact","datePublished":"2016-12-30T00:00:26+00:00","dateModified":"2022-04-05T14:34:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/"},"wordCount":696,"commentCount":0,"publisher":{"@id":"https:\/\/www.fullcontact.com\/#organization"},"image":{"@id":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#primaryimage"},"thumbnailUrl":"https:\/\/miro.medium.com\/max\/500\/1*jZIplari1WUuPnaD6nYABA.gif","articleSection":["Engineering"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/","url":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/","name":"Chaos Testing our Mobile Apps at FullContact | FullContact","isPartOf":{"@id":"https:\/\/www.fullcontact.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#primaryimage"},"image":{"@id":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#primaryimage"},"thumbnailUrl":"https:\/\/miro.medium.com\/max\/500\/1*jZIplari1WUuPnaD6nYABA.gif","datePublished":"2016-12-30T00:00:26+00:00","dateModified":"2022-04-05T14:34:23+00:00","description":"Let's have a bit of a straight talk \u2014 chances are your app isn\u2019t tested nearly as well as you\u2019d want it to be. And neither is ours. There are a lot of","breadcrumb":{"@id":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#primaryimage","url":"https:\/\/miro.medium.com\/max\/500\/1*jZIplari1WUuPnaD6nYABA.gif","contentUrl":"https:\/\/miro.medium.com\/max\/500\/1*jZIplari1WUuPnaD6nYABA.gif"},{"@type":"BreadcrumbList","@id":"https:\/\/www.fullcontact.com\/blog\/engineering\/chaos-testing-our-mobile-apps-at-fullcontact\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.fullcontact.com\/"},{"@type":"ListItem","position":2,"name":"Chaos Testing our Mobile Apps at FullContact"}]},{"@type":"WebSite","@id":"https:\/\/www.fullcontact.com\/#website","url":"https:\/\/www.fullcontact.com\/","name":"FullContact","description":"Relationships, reimagined.","publisher":{"@id":"https:\/\/www.fullcontact.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.fullcontact.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.fullcontact.com\/#organization","name":"FullContact","url":"https:\/\/www.fullcontact.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.fullcontact.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.fullcontact.com\/wp-content\/uploads\/2019\/11\/fc-logo@2x.png","contentUrl":"https:\/\/www.fullcontact.com\/wp-content\/uploads\/2019\/11\/fc-logo@2x.png","width":200,"height":38,"caption":"FullContact"},"image":{"@id":"https:\/\/www.fullcontact.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/fullcontact","https:\/\/www.linkedin.com\/company\/fullcontact-inc-","https:\/\/www.youtube.com\/user\/FullContactAPI"]},{"@type":"Person","@id":"https:\/\/www.fullcontact.com\/#\/schema\/person\/046a6157300f0577cf0a6122fb63080e","name":"FullContact","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.fullcontact.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/b4c9a289323b21a01c3e940f150eb9b8c542587f1abfd8f0e1cc1ffc5e475514?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b4c9a289323b21a01c3e940f150eb9b8c542587f1abfd8f0e1cc1ffc5e475514?s=96&d=mm&r=g","caption":"FullContact"},"url":"https:\/\/www.fullcontact.com\/blog\/author\/user\/"}]}},"_links":{"self":[{"href":"https:\/\/www.fullcontact.com\/wp-json\/wp\/v2\/posts\/17986","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fullcontact.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fullcontact.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fullcontact.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fullcontact.com\/wp-json\/wp\/v2\/comments?post=17986"}],"version-history":[{"count":0,"href":"https:\/\/www.fullcontact.com\/wp-json\/wp\/v2\/posts\/17986\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.fullcontact.com\/wp-json\/wp\/v2\/media?parent=17986"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fullcontact.com\/wp-json\/wp\/v2\/categories?post=17986"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fullcontact.com\/wp-json\/wp\/v2\/tags?post=17986"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}