AppSpector — український продукт, що допомагає в тестуванні та моніторингу мобільних застосунків

💡 Усі статті, обговорення, новини про Mobile — в одному місці. Приєднуйтесь до Mobile спільноти!

Доброго дня, з вами Артур Шевченко, і в цій статті я би хотів вас познайомити з AppSpector — помічником під час розробки, дебагінгу та тестування мобільних застосунків. Чому треба звернути на нього увагу? По-перше, це наш український продукт, родом з мого рідного міста Дніпра. По-друге, він є поєднанням таких інструментів: Android Studio / XCode та сніферів трафіку. І традиційно: якщо ви більше полюбляєте формат відео і вам хочеться подивитись, як це все робилось, заглядайте на мій ютуб-канал. І якщо вас цікавлять думки, статті, курси та корисні матеріали про тестування, розробку та менеджмент, буду радий вас бачити у своєму телеграм-каналі.

Почну одразу з плюсів та мінусів:

Плюси:

  • легкий моніторинг логів, нетворку, перфомансу, баз даних та загалом файлової системи;
  • фільтрування та шифрування ваших даних;
  • легка інтеграція та підтримка від команди AppSpector;
  • можливість мокати локацію;
  • повноцінний перегляд та редагування баз даних;
  • створення власних бекдорів у застосунок для поліпшення тестування;

Мінуси:

  • потрібна інтеграція в застосунок;
  • немає можливості мокати response або видозмінювати request (як це можна робити у Fiddler / Charles / Proxyman).

Тож розгляньмо, як можна використовувати AppSpector у тестуванні та як його додати до проєкту. Розбиратися будемо на прикладі Android-застосунку.

Як взагалі працює AppSpector

Тут доволі все просто: ви інтегруєте у ваш застосунок SDK AppSpector, далі він акумулює інфо та віддає по вебсокету на сервачок AppSpector’a і після, зайшовши у веб-застосунок або десктопний застосунок ви можете монітори всі метрики що збирає AppSpector. Для людей які піклуються про безпеку — у AppSpector є варіант з шифруванням даних які ніхто не побаче крім вас.

Як інтегрувати AppSpector у наш застосунок

Спочатку вам треба зареєструватись. Після цього ви зможете створити або організацію, або проєкт. Проєктів може бути скільки завгодно. Кожен з них буде мати унікальну ідентифікацію.

Наразі AppSpector підтримує iOS-, Android- та Flutter-застосунки.

Обираючи тип застосунку, ви попадаєте на головну дашборду, де можете побачити активні сесії (сеанси користування вашим застосунком) та налаштування проєкту.

Аби перемикатися між проєктам, є кнопка Jump to project.

Нам потрібно зайти в сеттінги та запамʼятати API Key

Далі перейдемо в Android Studio та підімкнемо SDK до нашого застосунку.

У файл build.gradle на рівні проєкту додамо:

buildscript {
  repositories {
      jcenter()
      google()
   maven { url "https://maven.appspector.com/artifactory/android-sdk" }
  }
  
  dependencies {
      classpath "com.appspector:android-sdk-plugin:1.+"
  }
}

А також у файл на рівні застосунку app/build.gradle додамо:

apply plugin: 'com.android.application'
// Put AppSpector plugin after Android plugin
apply plugin: 'com.appspector.sdk'

// Add AppSpector maven repository
repositories {
    maven { url "https://maven.appspector.com/artifactory/android-sdk" }
}

dependencies {
    implementation "com.appspector:android-sdk:1.+"
}

Нам треба ініціалізувати AppSpector. Для цього:

import android.app.Application;
import com.appspector.sdk.AppSpector;
public class AmazingApp extends Application {
   @Override
   public void onCreate() {
      super.onCreate();
      // Стартонути з всіма моніторингами
      AppSpector
            .build(this)
            .withDefaultMonitors()            
            .run("API_KEY");
            
      // Або вибрати ті які вам треба
      AppSpector
            .build(this)
            .addPerformanceMonitor()
            .addHttpMonitor()
            .addLogMonitor()
            .addScreenshotMonitor()
            .addSQLMonitor()
            .run("API_KEY");
   }
}

Logs

Відкриваємо застосунок, відкриваємо дашборд AppSpector і бачимо, що наш девайс став онлайн. А якщо натиснемо на нього, побачимо, що магія почала працювати. Перше, що може нас цікавити, — це логи. Логи можна фільтрувати за типом, можна шукати за ключовими словами, а також можна експортувати їх.

Network

Для того, щоб підімкнути моніторинг запитів від девайсу та відповідей від сервера, нам треба дописати пару рядків коду. Наприклад якщо використовуєте ретрофіт, щоб побачити запити достатньо написати таке:

OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(new AppSpectorOkHttp3Interceptor())
            .build();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://petstore.swagger.io/v2/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build();

Робимо декілька запитів, відкриваємо AppSpector з браузера та переходимо в Network. І вуаля, магія стала ще кращою: бачимо всі наші запити та відповіді. Також можемо фільтрувати та шукати, що саме нам треба. І також все це можна експортувати архівчиком.

Ще з цікавого є таке: за бажання ви можете ще й фільтрувати, що показувати (або що не показувати) в логах. Знову ж таки, з міркувань безпеки ви можете прибирати якісь хедери, наприклад. Або запити на якісь домени.

Events

Наступна цікава фіча — це івенти. Івенти — це щось типу розширеного кастомного логування (я би якось так це описав). Для цього нам треба зробити декілька речей. Наприклад, просто логуватимемо нашу DTO тваринки, яку створюємо. Уявімо, що в нас десь є клас Pet з полями. Додаймо внутрішній клас, який буде створювати нам івент. Для цього нам треба в новому класі імплементувати інтерфейс CustomEventPayload і три методи в ньому — getName, getCategory та getPayload.

   class PetModelEvent implements CustomEventPayload{
        @NonNull
        @Override
        public String getName() {
            return "Custom Event Pet";
        }
        @NonNull
        @Override
        public String getCategory() {
            return "Application DTO";
        }
        @NonNull
        @Override
        public Map<String, Object> getPayload() {
            final Map<String, Object> payload = new HashMap<>();
            payload.put("sampleDate", new Date());
            payload.put("id", id);
            payload.put("name", name);
            payload.put("status", status);
            return payload;
        }
    }

А тепер там, де відбувається створення або надсилання нашого Pet, треба додати виклик цього івента як:

CustomEventsSender.send(pet.new PetModelEvent());

І івент буде виглядати таким чином. Дуже корисно, якщо вам треба моніторити щось конкретне так, щоб не заважав нескінченний потік логів.

Environment

Поїхали далі. Наступна фіча — це Environment. Це характеристики вашого девайсу та застосунку на ньому.

File System

Доволі цікава можливість — перегляд вашої файлової системи застосунка. Тут ви можете побачити, які файли зберігає застосунок, зокрема базу даних, sharedPreferences та інше. А також завантажити необхідні для вас файли.

Скриншоти

Усім нам треба робити час від часу скриншоти для багів. З AppSpector не треба перекидати ваш скриншот на пошту, або підключати шнурком та перекидати ним, або встановлювати додаткові програми для трансляції екрану. Для цього достатньо перейти у вкладку Screenshot и натиснути «Зберегти».

Команди

А оце моя улюблена фіча. Команди! Доволі крута штука, яка відкриває бекдор у наш застосунок. Через команди ви можете тригернути будь-що у вашому застосунку ззовні. Створити тост-меседж, зробити Api call, тригернути метод якогось класу — все це тепер можливо. Робиться це теж нескладно: наприклад, виведемо тост-меседж якийсь. Для цього спочатку додамо новий клас ShowToastCommand:

@Command(value = "Show message", category = "Application")
public class ShowToastCommand extends BaseCommand<Integer> {
    @Argument(isRequired = true)
    public String message;
}

А далі зареєструємо вашу команду:

public class RestApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        AppSpector.shared().commands().register(ShowToastCommand.class, new CommandCallback<Integer, ShowToastCommand>() {
            @Override
            public void exec(@NonNull final ShowToastCommand command, @NonNull final Responder<Integer> responder) {
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(), command.message, Toast.LENGTH_SHORT).show();
                        responder.ok(200);
                    }
                });
            }
        });

SQLite

Думали, це все? А ні! Ви ще можете моніторити бази даних. Для цього достатньо просто перейти у вкладку SQLite, і тут ви зможете не тільки переглядати, а ще й модифікувати дані, робити вибірки та загалом користуватись інструментарієм запитів до баз даних.

Shared Preferences

І, звісно, ви можете так само переглядати та модифікувати SharedPreferences

Location

Доволі часто наші застосунки використовують локацію. І для легкої підміни локації можна використовувати цю фічу. Вона дозволяє створити кастомні локації й імітувати ваш застосунок в них.

Performance

Не менш цікавою штукою є моніторинг продуктивності вашого застосунку. Як часто відмальовується екран, яке завантаження процесора чи оперативної памʼяті, який заряд батареії. Це дуже допомагає дебажити, коли у вас виникають якісь меморі ліки в застосунку.


На цьому в мене все. Сподіваюсь, для вас це корисно та ваш набір інструментарію для мобільного тестування поповнився на ще один.

Не забувайте ставити лайки підписуватись на мій канал або ютубчик.

До нових зустрічей 🙂

👍ПодобаєтьсяСподобалось26
До обраногоВ обраному17
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Дякую за корисний огляд👍

Артур, дуже дякуємо за такий детальний огляд AppSpector. Щодо мінусів можу лише додати, що якраз зараз продкутова команда працює над можливістю мокати response, так що додатково юзати Charles чи інші тулзи вже буде не потрібно

оце так новина! кайф!

Підписатись на коментарі