[PYTHON] Créez un environnement pour l'automatisation des tests avec AirtestIDE (Astuces)

introduction

Récemment, j'ai commencé à automatiser le test des applications (jeux) pour smartphone avec AirtestIDE. Je voudrais donc expliquer ce que j'ai fait pour créer le script et l'environnement que j'ai réellement créés.

environnement

macOS 10.13.6 Airtest IDE 1.2.2(Python) Android 9

scénario

Incorporer des scripts couramment utilisés

from airtest.core.api import using
using("common.air")
from common import *

Si je me demandais quoi faire, c'était écrit dans le document officiel https://airtest.readthedocs.io/en/latest/README_MORE.html#import-from-other-air

Traitement en attente de traitement

import sys

def waitForExists(obj, timeout = 60):
    for t in range(timeout):
        if (exists(obj)): return 1
        elif t == timeout - 1:
            print("timeout")
            sys.exit()
        sleep(1)

Attendez le traitement jusqu'à ce qu'il trouve obj Je n'ai pas encore créé la gestion des exceptions du délai d'expiration. raise waitforobjecttimeouterror("Le traitement a expiré") Je veux ressembler à ça


def waitAndTouch(obj, timeout = 60):
    for t in range(timeout):
        if (exists(obj)):
            sleep(1)
            touch(obj)
            return 1
        elif t == timeout - 1:
            print("timeout")
            sys.exit()
        sleep(1)

Attendez de trouver obj, puis touchez

def swipeForExists(obj, obj2, vector, dulation = 8, maxCount = 10):
    for c in range(maxCount): 
        if (exists(obj)): break
        elif c == maxCount - 1:
            print("maxCount")
            sys.exit()
        elif (exists(obj2)):
            swipe(obj2, vector, duration = dulation)

Faites glisser obj2 jusqu'à ce que vous trouviez obj

def tapForExists(obj, obj2, timeout = 60):
    for t in range(timeout):
        if (exists(obj)):
            sleep(1)
            touch(obj)
            return 1
        elif t == timeout - 1:
            print("timeout")
            sys.exit()
        elif (exists(obj2)): touch(obj2)
        sleep(1)

Continuez à appuyer sur obj2 jusqu'à ce que vous trouviez obj (appuyez sur lorsque obj est trouvé)

def tapForNotExists(obj, obj2, timeout = 60):
    for t in range(timeout):
        sleep(1)
        if (not exists(obj)): return 1
        elif t == timeout - 1:
            print("timeout")
            sys.exit()
        elif (exists(obj2)): touch(obj2)

Continuez d'appuyer sur obj2 jusqu'à ce que vous ne trouviez pas obj

def tapForNotExistsXY(obj, x, y, timeout = 60):
    for t in range(timeout):
        sleep(1)
        if (not exists(obj)): return 1
        elif t == timeout -1:
            print("timeout")
            sys.exit()
        else:
            touch(v=(x,y))

Continuez à taper sur des coordonnées spécifiques jusqu'à ce que obj soit manquant

def tapIfExists(*args):
    n = 0
    for i in args:
        n += 1    
    if (exists(args[0])):
        sleep(1)
        if (n == 1):
            touch(args[0])
        elif (n == 2):
            touch(args[1])

Lorsqu'il y a un argument: appuyez sur s'il y a un objet cible Lorsqu'il y a deux arguments: s'il y a un obj cible, appuyez sur obj2

Avec autant de travail, la plupart des choses que je veux faire sont devenues suffisantes.

Journal de sortie

import datetime

def log_ok(file, msg):
    now = datetime.datetime.now()
    #for airtestIDE
    file.write(now.strftime("%Y/%m/%d %H:%M:%S") + " [info] " + msg + " OK" + chr(10))
    #for airtest
    #file.write(now.strftime("%Y/%m/%d %H:%M:%S") + " [info] " + msg.decode("utf-8") + " OK".decode("utf-8") + chr(10))
    file.flush()

Il semble que le traitement du code de caractère soit différent entre AirtestIDE et Airtest

import codecs
file = codecs.open("<Nom du fichier journal>", "w", "utf-8")
log_ok(file, "Démarrage automatique du test")

###for IDE
install("../<App>.apk")
###for CLI
#install("<App>.apk")
log_ok(file, "Step1 -Installation")
start_app("<Identifiant d'application>")

#(Omis)

log_ok(file, "Fin du test automatique")
stop_app("<Identifiant d'application>")
file.close()

Exemple d'utilisation. De plus, il semble que le chemin de l'application soit légèrement différent lors de l'exécution à partir de l'IDE et lors de l'exécution à partir de la CLI IDE ... Le dossier air exécuté devient le home CLI ... L'endroit où vous l'avez exécuté devient votre maison

Publier les résultats sur Slack


import json
import requests

url = "https://slack.com/api/chat.postMessage"
token = "<token>"
channel = "<channel>"
message = "De la sortie du journal" + chr(10) + "C'est un échantillon"

body = {
    'token' : token,
    'channel' : channel,
    'text' : message,
    'as_user' : 'true'
}

requests.post(url, data=body)

Je pense importer le fichier journal de sortie et le publier dans Slack. https://api.slack.com/methods/chat.postMessage

Ligne de commande

Exécuter à partir de la ligne de commande

adb shell input keyevent KEYCODE_WAKEUP
cd $PROJECT_HOME
/Applications/AirtestIDE.app/Contents/MacOS/AirtestIDE runner "<projet>.air" --device Android:/// --log log

Image pour commencer par frapper le shell de Jenkins etc.

Obtenez le rapport

/Applications/AirtestIDE.app/Contents/MacOS/AirtestIDE reporter "<projet>.air" --log_root log --export exp

Vous pouvez obtenir des rapports plus riches avec Airtest IDE qu'avec airtest Ce serait bien de définir la destination de sortie du rapport sur DocumentRoot d'apache afin qu'il puisse être référencé depuis l'intranet.

Exécuter en connectant plusieurs unités

$ airtest run argo.air --device Android://127.0.0.1:5037/<serialno>

Lorsque plusieurs terminaux de smartphone sont connectés via USB, si vous spécifiez `<numéro de série>` répertorié avec la commande `périphériquesadb```, vous pouvez exécuter plusieurs périphériques en même temps ( Je ne l'ai pas encore essayé avec Airtest IDE)

en conclusion

Avez-vous trouvé des références? Il y a eu certains points sur lesquels je suis tombé lorsque j'ai essayé d'implémenter le script, donc j'espère que cela aide.

Recommended Posts

Créez un environnement pour l'automatisation des tests avec AirtestIDE (Astuces)
Créer un environnement avec virtualenv
Créer un environnement pour Django x Apache x mod_wsgi avec Vagrant (Ubuntu 16.04)
Créez un environnement d'exécution pour chaque langue avec boot2docker
Construire un environnement Anaconda pour Python avec pyenv
Diverses commandes pour créer un environnement avec Apache
Essayez de créer un environnement pour MayaPython avec VisualStudioCode
Automatisation des tests pour le travail
[Linux] WSL2 Créer un environnement pour laravel7 avec Ubuntu 20.04
Créer un environnement pour le traitement du langage naturel avec Python
Créer un environnement pour MkDocs sur Amazon Linux (tentative)
Créez un environnement Open AI Gym avec Bash sur Windows 10
Créer une API avec Django
Reconstruction de l'environnement pour l'apprentissage automatique avec Miniconda (version Windows)
Makefile minimal et buildout.cfg pour créer un environnement avec buildout
Créer un environnement d'exécution Windows Python avec VScode + Remote WSL
Créez un alias pour Route53 vers CloudFront avec l'API AWS
Conseils pour exécuter Go avec Docker
Conseils pour l'importation de TensorFlow optimisé pour macOS dans un environnement de puce Apple M1
Créez un environnement virtuel avec Python!
Création d'un environnement pour Anaconda et Jupyter
Créez une tranche d'âge avec les pandas
Créez un environnement d'apprentissage automatique arbitraire avec GCP + Docker + Jupyter Lab
Créer un Ubuntu de démarrage USB avec un environnement Python pour l'analyse des données
Créer une application en classifiant avec Pygame
[Python] Création d'un environnement avec Anaconda [Mac]
Créer un environnement pour Python intégré à Blender
Créer une visionneuse de traitement d'image avec PySimpleGUI
Remarques lors de la création d'un environnement avec python
Conseils pour gérer les binaires en Python
Créons un environnement virtuel pour Python
[Python] Créez un environnement virtuel avec Anaconda
Créez rapidement un fichier Excel avec Python #python
Créer un environnement Python + uWSGI + Nginx avec Docker
Conseils pour utiliser python + caffe avec TSUBAME
Conseils pour tracer plusieurs lignes avec des pandas
Crawl Follower pour un compte avec Instagram
Créer un environnement OpenCV3 + python3 sur OSX
[Python] Créez rapidement une API avec Flask
Automatisation des tests à partir de L-Chika (3) Incorporation d'un oscilloscope
Générer une instance Excel compatible avec les compléments avec xlwings
Créez une application de mots anglais avec python
Construire un environnement pour "Tello_Video" avec Raspbian
Créez un fichier msi évolutif avec cx_Freeze
Création d'un environnement pour "Tello_Video" sous Windows
Notes de l'installation de Homebrew à la création d'un environnement Anaconda pour Python avec pyenv
J'ai essayé de créer un environnement à vérifier régulièrement en utilisant Selenium avec AWS Fargate
[Création d'un environnement CI en 2 heures] Procédure de création d'un serveur Web Python avec CircleCI et réussite d'un test de communication HTTP
Créez un environnement de test Vim + Python en 1 minute
Pour les débutants à créer un environnement Anaconda. (Note)
Créez des données de test comme ça avec Python (partie 1)
Créez une application qui devine les étudiants avec Python
Créer un programme académique avec optimisation des combinaisons
Créer un environnement pour exécuter des scripts Python (pour Mac)
Créer un LINE BOT avec Minette pour Python