• Stars
    star
    150
  • Rank 239,668 (Top 5 %)
  • Language
    Swift
  • License
    MIT License
  • Created almost 6 years ago
  • Updated 11 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

iOS UI testing framework https://t.me/mixbox_english https://t.me/mixbox_russian

Overview

Version License Build Status

Powerful E2E UI testing framework for iOS.

Currently it is used in Avito, where we have 700+ E2E UI tests, about 90% of them are green and they helped us to reduce manual testing for already 2 years. We run about 25% on PR and we are working towards executing 100% of tests on pull request, partially by switching from Black Box E2E to Gray Box testing. We are running those tests on 3 platforms and it takes ~40 minutes (total duration of tests is 30+ hours), because we are using Emcee, a test runner that runs tests on multiple machines (note that Mixbox doesn't require Emcee). We're writing Gray Box tests too (where we mock classes, network and everything), but we just started.

If you are enthusiastic about using it in your company, file us an issue. We are making it to be usable by community, however, it is not our main goal.

Features

  • Actions and checks (obviously)

  • Per-pixel visibility check

  • Everything has polling

  • Fully automatic scrolling

  • Black box AND gray box testing!

    • Black box tests are run in a separate app and are able to launch app. You can test more application features with this type of testing. You can use mocks, but it will require you to write more code (use launch arguments or implement inter-process communication).
    • Gray box tests are run within the application (as in EarlGrey), but tests are runtime compatible with black box tests, so you can share your test model, page objects, test helpers, etc. You can mock easily anything, because test are executed within same process. You can't test starting your app up without using mocks.

    Most of the code is shared between gray box and black box tests, as the most of the features. Both options have their own benefits. Use both approaches to have a good test pyramid.

  • Page Objects

    • Can have functions with any code inside
    • Page object elements can nest elements (however, it requires some not-so-good looking boilerplate)
    • Everything (actions/checks) is fully extensible. If you implement custom action or check, it will automatically work for black box and gray box testing (see SwipeAction, all builtin actions are really extensions).
  • Every cell inside UICollectionView is visible in tests (including offscreen cells)

  • Customizable inter-process communication between app and tests

  • Custom values for views that are visible in tests

  • Network mocking (via NSURLSessionProtocol)

  • Setting permissions (camera/geolocation/notifications/etc)

  • Simulation of push-notifications (limitations: only inside active app!)

  • Opening url from tests

  • Geolocation simulation

  • Hardware keyboard (very few key codes are defined, however it can be easily implemented)

  • Customizable without forking repository

  • Swift & Objective-C

  • Tested

    • 176 black box UI tests on 3 device configurations
    • 155 gray box UI tests on 3 device configurations
    • 100 unit tests on 4 device configurations
    • SwiftLint + custom linter
    • All tests are executed per every pull request to Mixbox, and usually 1 PR equals 1 commit.
    • Two demos are tested with 5 versions of Xcode (10.0, 10.1, 10.2.1, 10.3, 11.0).
  • Configurable reports (e.g.: Tests project has integration with Allure, an open sourced reporting system with web UI, and in Avito we use in-house solution for reports; you can write your own implementation)

In development / not open sourced yet:

  • Code generation of page objects
  • Getting all assertion failures from app
  • Facade for working with springboard
  • Switching accessibility values between release and test builds

Installation

There are two ways to use Mixbox.

First is described in Demo, it is oversimplified, basically you just use pod SomePod.

The second we use in Avito and it looks like this: Tests (see Podfile there).

There are not enough docs yet, so you can try simple approach of linking Mixbox (Demo), but use code examples from Tests.

Supported iOS/Xcode/Swift versions

  • Xcode 11
  • Swift 5
  • iOS 10.3, iOS 11.4, iOS 12.1, intermediate versions may work or may not, the mentioned versions are tested on CI
  • Cocoapods 1.8.4
  • Mac OS 10.14.6

Xcode 9/10 and older versions are not supported anymore. If you are planning to use the project on different environment and have problems, let us know.

Known issues

  • Crashes on iOS 11.2 (works ok on iOS 11.3, iOS 11.4)
  • Setting permissions doesn't work on physical devices (and maybe something else, we don't test on physical devices; basic things work)
  • Device rotation was not tested, I think we have bugs with it
  • iPads were not tested
  • Russian language in reports (will be fixed soon)

Examples

For real examples, see Tests project. It is most up-to-date open sourced examples of how to use it, but it lacks realism (doesn't show it how to tests are written for a real app).

Example of test that show basic features:

func test() {
    // Setting permissions
    permissions.camera.set(.allowed)
    permissions.photos.set(.notDetermined)

    // Functions are useful in page objects and allows
    // reusing code, for example, for transitions between states of the app
    pageObjects.initial
        .authorize(user: testUser)
        .goToCvScreen()
        
    // Aliases for simple assertions (you can add your own):
    pageObjects.simpleCv.view.assertIsDisplayed()
    pageObjects.simpleCv.title.assertHasText("My CV")
    
    // Fully customizable assertions
    pageObjects.simpleCv.addressField.assertMatches { element in
        element.text != addressFieldInitialText && element.text.isNotEmpty
    }
    
    // Network stubbing.
    networking.stubbing
        .stub(urlPattern: ".*?example.com/api/cv")
        .thenReturn(file: "cv.json")
    // There is also a monitoring feature, including recording+replaying feature that
    // allows to record all network and replay in later, so your tests will not require internet.
    
    // Actions
    pageObjects.simpleCV.occupationField.setText("iOS developer")
    pageObjects.simpleCV.createCVButton.tap()
}

Declaring page objects:

public final class MapScreen:
    BasePageObjectWithDefaultInitializer,
    ScreenWithNavigationBar // protocol extensions are very useful for sharing code
{
    // Basic locator  
    public var mapView: ViewElement {
        return element("Map view") { element in
            element.id == "GoogleMapView"
        }
    }
    
    // You can use complex checks
    // Note that you can create your own matchers like `element.isFooBar()`
    public func pin(coordinates: Coordinates, deltaInMeters: Double = 10) -> ViewElement {
        return element("Pin with coordinates \(coordinates)") { element in
            element.id == "pin" && element
                .customValues["coordinates", Coordinates.self]
                .isClose(to: coordinates, deltaInMeters: deltaInMeters)
        }
    }
}

Declaring custom page object elements:

public final class RatingStarsElement:
    BaseElementWithDefaultInitializer,
    ElementWithUi
{
    public func assertRatingEqualsTo(
        _ number: Int,
        file: StaticString = #file,
        line: UInt = #line)
    {
        assertMatches(file: file, line: line) { element in
            element.customValues["rating"] == number
        }
    }
}

Copypasted code

This library includes some code copypasted from other libraries. Sometimes it is a single file, some times it is because we need conditional compilation built in in sources to prevent linking the code in release builds.

Used in tests:

Other docs

More Repositories

1

playbook

AvitoTech team playbook
1,443
star
2

Paparazzo

Custom iOS camera and photo picker with editing capabilities
Swift
769
star
3

avito-android

Infrastructure of Avito android
Kotlin
356
star
4

Emcee

Emcee is a tool that runs Android and iOS tests in parallel using multiple simulators and emulators across many servers
Swift
323
star
5

bioyino

High performance and high-precision multithreaded StatsD server
Rust
225
star
6

netramesh

Ultra light service mesh for any orchestrator
Go
220
star
7

Marshroute

Marshroute is an iOS Library for making your Routers simple but extremely powerful
Swift
220
star
8

deepsecrets

Secrets scanner that understands code
Python
180
star
9

aqueduct

Framework for create performance-efficient prediction
Python
171
star
10

go-transaction-manager

Transaction manager for GoLang
Go
165
star
11

go-mutesting

Mutation testing for Go source code. Fork from https://github.com/zimmski/go-mutesting
Go
129
star
12

krop

Small widget for image cropping in Instagram-like style
Kotlin
126
star
13

autumn-2021-intern-assignment

98
star
14

avitotech-presentations

Go
91
star
15

internship_backend_2022

Тестовое задание на позицию стажера-бэкендера
Go
84
star
16

Calcifer

Calcifer
Swift
72
star
17

nginx-log-collector

nginx-log-collector
Go
54
star
18

sx-frontend-trainee-assignment

Тестовое задание для стажёра Frontend в команду Seller Experience
53
star
19

Konveyor

Kotlin
48
star
20

auto-backend-trainee-assignment

Тестовое задание на позицию бекенд разработчика в юнит Авто
39
star
21

navigator

Multicluster service mesh solution based on envoy
Go
39
star
22

pulemet

Controlled RPS for interservice communication
Python
39
star
23

android-ui-testing

Kotlin
38
star
24

python-trainee-assignment

Тестовое задание по python
37
star
25

normalize

Go
35
star
26

adv-backend-trainee-assignment

Тестовое задание для стажёра Backend в команду Advertising
29
star
27

frontend-trainee-assignment-2023

27
star
28

job-backend-trainee-assignment

Тестовое задание на позицию стажера-бекендера в юнит "Работа"
27
star
29

internship_frontend_2022

Тестовое задание на позицию стажера-фронтендера
TypeScript
26
star
30

safedeal-frontend-trainee

22
star
31

pg_reindex

Console utility for rebuilding indexes and primary keys for PostgreSQL in automatic mode with analysis of index bloating and without table locking
Python
21
star
32

msg-backend-trainee-assignment

В ДАННЫЙ МОМЕНТ НЕ АКТУАЛЬНО! Тестовое задание на позицию стажера-бекендера
21
star
33

verticals

Публичный репозиторий кластера Verticals
19
star
34

pro-fe-trainee-task

Тестовое задание для FE стажера в Авито Pro (Команда ARPU)
19
star
35

ios-trainee-problem-2021

Тестовое задание для стажера по направлению iOS
19
star
36

geo-backend-trainee-assignment

18
star
37

android-trainee-task-2021

18
star
38

blur-layout

Support for blurred semitransparent backgrounds in Android.
Assembly
18
star
39

smart-redis-replication

Go
18
star
40

mi-backend-trainee-assignment

Тестовое задание для стажёра Backend в команду MI
17
star
41

dba-utils

Shell
17
star
42

clickhouse-vertica-udx

UDF to seamlessly connect ClickHouse to Vertica using external tables
C++
16
star
43

internship

Тестовое задание для iOS-стажировки
15
star
44

abito

Python package for hypothesis testing. Suitable for using in A/B-testing software
Python
15
star
45

prop-types-definition

Patch for prop-types to get property type definition in runtime
JavaScript
15
star
46

tm-backend-trainee

Тестовое задание для стажёра Backend в команду Trade Marketing
13
star
47

mx-backend-trainee-assignment

Тестовое задание для стажёра Backend в команду MX
13
star
48

CommandLineToolkit

Small swift package to create command line tools faster
Swift
13
star
49

antibot-developer-trainee

Тестовая задача для разработчика-стажёра в команду Информационной безопасности Авито для защиты сайта от ботов
13
star
50

bx-backend-trainee-assignment

Тестовое задание на позицию стажера-бекендера в юнит Buyer Experience
12
star
51

internship_ios_2022

Тестовое задание на позицию стажёра в iOS
Swift
10
star
52

patterns-and-practices-abstracts

9
star
53

dba-docs

PLpgSQL
9
star
54

ImageSource

Image abstraction toolkit
Swift
8
star
55

qa-trainee-task

Тестовое задание для стажёра-автоматизатора
8
star
56

gravure

Image processing microservice
Rust
8
star
57

pro-backend-trainee-assignment

7
star
58

puppet-controlrepo-template

Шаблон control repo для Puppet к статье «Инфраструктура как код в Авито: уроки которые мы извлекли»
Ruby
7
star
59

pgmock

PostgreSQL 9.4+ extension for unit tests
PLpgSQL
7
star
60

mi-trainee-task-2021

6
star
61

mi-trainee-task

Тестовое задание для стажера в Market Intelligence.
6
star
62

android-trainee-task

6
star
63

ShopX-QA-trainee

задания к собеседованию
6
star
64

ios-trainee-problem

Задача для стажера на платформу iOS
6
star
65

iOS-trainee-assignment-2023

5
star
66

protocol-writer

Simplest of apps to write timed protocols from interviews
JavaScript
5
star
67

bx-android-trainee-assigment

5
star
68

safedeal-backend-trainee

5
star
69

puppet-module-template

Шаблон Puppet модуля к статье «Инфраструктура как код в Авито: уроки которые мы извлекли»
Ruby
5
star
70

trainspotting

Python Dependency Injector based on interface binding
Python
5
star
71

android-peerlab-moscow

5
star
72

ap-frontend-trainee-assignment

5
star
73

GraphiteClient

Lightweight Swift framework for feeding data into Graphite and statsD.
Swift
4
star
74

video-course-patterns-and-practices

PHP
4
star
75

xrpcd

PostgreSQL RPC built on top of pgq.
Python
4
star
76

doner

Centralized file downloading service
Rust
4
star
77

moira

Go
3
star
78

qa-trainee-general

Тестовое задание для QA-cтажёра
3
star
79

aaa-ml-sys-design

ML System Design lectures materials
Python
3
star
80

aaa-ml-datasets-course

Репозиторий курса по созданию датасетов Академии Аналитиков Авито
Jupyter Notebook
3
star
81

vas-frontend-trainee-assignment

Задание для стажёра в команду VAS
2
star
82

Emcee.cloud.action

GItHub action for emcee.cloud
TypeScript
2
star
83

moira-client

Python
2
star
84

qa-into-CoE-trainee-task

Тестовое задание для стажёра QA в Центр экспертизы по Обеспечению качества
2
star
85

EmceePluginSupport

Swift package that allows to extend Emcee with plugins
Swift
1
star
86

test-asap

Package for easy to start browser testing
JavaScript
1
star
87

moira-web

JavaScript
1
star
88

avito-vault

Puppet модуль, автоматизирующий выкладку секретов из vault.
Ruby
1
star
89

alert-autoconf

Python
1
star
90

brave-new-billing

Тестовое задание для backend-стажёра в юнит Billing, Avito
1
star