2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. Qu'est-ce que le test d'interface ?
Comme son nom l'indique, les tests d'interface consistent à tester l'interface entre des systèmes ou des composants, principalement pour vérifier l'échange de données, les processus de gestion de transfert et de contrôle, ainsi que les dépendances logiques mutuelles. Les protocoles d'interface sont divisés en HTTP, WebService, Dubbo, Thrift, Socket et autres types. Les types de tests sont principalement divisés en tests fonctionnels, tests de performances, tests de stabilité, tests de sécurité, etc.
Dans le modèle « pyramidal » de tests en couches, les tests d'interface appartiennent à la deuxième couche de tests d'intégration de services. Par rapport aux tests automatisés de la couche d'interface utilisateur (principalement WEB ou APP), les tests automatisés d'interface présentent de plus grands avantages, sont faciles à mettre en œuvre, ont de faibles coûts de maintenance et ont un rapport entrées-sorties plus élevé. C'est le premier choix à réaliser pour chaque entreprise. tests automatisés.
Ci-dessous, nous prenons une interface HTTP comme exemple pour présenter pleinement le processus de test d'automatisation de l'interface : de l'analyse des exigences à la conception de cas d'utilisation, de l'écriture de scripts, de l'exécution des tests à l'analyse des résultats, et fournissons une conception complète de cas d'utilisation et des scripts de test.
2. Processus de base
Le processus de test automatisé de la fonction d’interface de base est le suivant :
Analyse des exigences->Conception de cas d'utilisation->Développement de scripts->Exécution de tests->Analyse des résultats
2.1 Exemple d'interface
Nom de l'interface : recherche de films Douban
Adresse du document d'interface : https://developers.douban.com/wiki/?title=movie_v2#search
Exemple d'appel d'interface :
1) Recherche par casting et équipe : https://api.douban.com/v2/movie/search?q=Zhang Yimou
2) Recherche par titre de film : https://api.douban.com/v2/movie/search?q=西游之西游
3) Recherche par genre : https://api.douban.com/v2/movie/search?tag=comedy
3. Besoin d'analyse
L'analyse des exigences fait référence à des documents tels que les exigences et la conception.Sur la base de la compréhension des exigences, il est également nécessaire de comprendre la logique de mise en œuvre interne, et à ce stade, les aspects déraisonnables ou omis des exigences et de la conception peuvent être signalés.
Par exemple : l'interface de recherche de films Douban, l'exigence que je comprends est de prendre en charge la recherche de titres de films, d'acteurs et de tags, et de renvoyer les résultats de recherche dans des pages.
4. Conception de cas d'utilisation
La conception des cas d'utilisation est basée sur la compréhension des exigences de test de l'interface et sur l'utilisation de logiciels de cartographie mentale tels que MindManager ou XMind pour rédiger la conception des cas de test. Le contenu principal comprend la vérification des paramètres, la vérification des fonctions, la vérification des scénarios commerciaux, la vérification de la sécurité et des performances, etc. Les méthodes de conception de cas d'utilisation incluent la division en classes d'équivalence, l'analyse des valeurs limites, l'analyse de scénarios, les diagrammes de cause à effet, les tableaux orthogonaux, etc.
Pour la partie test de fonction de l'interface de recherche de films Douban, nous nous concentrons principalement sur trois aspects : la vérification des paramètres, la vérification des fonctions et la vérification des scénarios commerciaux. Les exemples de tests de conception sont les suivants :
Sur la base de la conception du scénario de test écrite ci-dessus, nous avons utilisé le framework python+nosetests pour écrire des scripts de tests automatisés pertinents. Il peut pleinement réaliser les fonctions de test automatisé d'interface, d'exécution automatique et d'envoi par courrier électronique des rapports de test.
Les bibliothèques lib nécessaires sont les suivantes. Vous pouvez les installer à l'aide de la commande pip :
-
- pip install nose
-
- pip install nose-html-reporting
-
- pip install requests
En utilisant la bibliothèque de requêtes, nous pouvons facilement écrire la méthode d'appel d'interface ci-dessus (comme la recherche de q=Andy Lau, l'exemple de code est le suivant) :
-
- #coding=utf-8
-
- import requests
-
- import json
-
-
- url = 'https://api.douban.com/v2/movie/search'
-
- params=dict(q=u'刘德华')
-
- r = requests.get(url, params=params)
-
- print 'Search Params:n', json.dumps(params, ensure_ascii=False)
-
- print 'Search Response:n', json.dumps(r.json(), ensure_ascii=False, indent=4)
Lors de l'écriture de scripts de test automatisés, nous devons effectuer une certaine encapsulation. Dans le code suivant, nous encapsulons l'interface de recherche de films Douban. La méthode test_q n'a besoin que d'utiliser la méthode de rendement fournie par nosestests pour parcourir facilement chaque ensemble de tests de la liste qs :
-
- class test_doubanSearch(object):
-
-
- @staticmethod
-
- def search(params, expectNum=None):
-
- url = 'https://api.douban.com/v2/movie/search'
-
- r = requests.get(url, params=params)
-
- print 'Search Params:n', json.dumps(params, ensure_ascii=False)
-
- print 'Search Response:n', json.dumps(r.json(), ensure_ascii=False, indent=4)
-
-
- def test_q(self):
-
- # 校验搜索条件 q
-
- qs = [u'白夜追凶', u'大话西游', u'周星驰', u'张艺谋', u'周星驰,吴孟达', u'张艺谋,巩俐', u'周星驰,大话西游', u'白夜追凶,潘粤明']
-
- for q in qs:
-
- params = dict(q=q)
-
- f = partial(test_doubanSearch.search, params)
-
- f.description = json.dumps(params, ensure_ascii=False).encode('utf-8')
-
- yield (f,)
Nous pouvons écrire des scripts de test automatisés pour chaque fonction dans l'ordre selon la conception du scénario de test.
5.3 Vérification des résultats
Lorsque nous testons l'interface manuellement, nous devons juger si le test réussit en fonction des résultats renvoyés par l'interface. Il en va de même pour les tests automatisés.
Pour cette interface, nous recherchons "q=Andy Lau" et nous devons déterminer si les résultats renvoyés contiennent "l'acteur Andy Lau ou le titre du film Andy Lau". Lors de la recherche de "tag=comedy", nous devons déterminer le type de film. film dans les résultats renvoyés. Qu'il s'agisse de "comédie", il est nécessaire de vérifier si le nombre de résultats renvoyés est correct lors de la pagination des résultats, etc. Le code complet de vérification des résultats est le suivant :
-
- class check_response():
-
- @staticmethod
-
- def check_result(response, params, expectNum=None):
-
- # 由于搜索结果存在模糊匹配的情况,这里简单处理只校验第一个返回结果的正确性
-
- if expectNum is not None:
-
- # 期望结果数目不为None时,只判断返回结果数目
-
- eq_(expectNum, len(response['subjects']), '{0}!={1}'.format(expectNum, len(response['subjects'])))
-
- else:
-
- if not response['subjects']:
-
- # 结果为空,直接返回失败
-
- assert False
-
- else:
-
- # 结果不为空,校验第一个结果
-
- subject = response['subjects'][0]
-
- # 先校验搜索条件tag
-
- if params.get('tag'):
-
- for word in params['tag'].split(','):
-
- genres = subject['genres']
-
- ok_(word in genres, 'Check {0} failed!'.format(word.encode('utf-8')))
-
-
- # 再校验搜索条件q
-
- elif params.get('q'):
-
- # 依次判断片名,导演或演员中是否含有搜索词,任意一个含有则返回成功
-
- for word in params['q'].split(','):
-
- title = [subject['title']]
-
- casts = [i['name'] for i in subject['casts']]
-
- directors = [i['name'] for i in subject['directors']]
-
- total = title + casts + directors
-
- ok_(any(word.lower() in i.lower() for i in total),
-
- 'Check {0} failed!'.format(word.encode('utf-8')))
-
-
- @staticmethod
-
- def check_pageSize(response):
-
- # 判断分页结果数目是否正确
-
- count = response.get('count')
-
- start = response.get('start')
-
- total = response.get('total')
-
- diff = total - start
-
-
- if diff >= count:
-
- expectPageSize = count
-
- elif count > diff > 0:
-
- expectPageSize = diff
-
- else:
-
- expectPageSize = 0
-
-
- eq_(expectPageSize, len(response['subjects']), '{0}!={1}'.format(expectPageSize, len(response['subjects'])))
Pour le script de test ci-dessus, nous pouvons utiliser la commande nosetests pour exécuter facilement des tests automatisés et utiliser le plug-in nose-html-reporting pour générer des rapports de test au format HTML.
Exécutez la commande comme suit :
nosetests -v test_doubanSearch.py:test_doubanSearch --with-html --html-report=TestReport.html
Une fois le test terminé, nous pouvons utiliser la méthode fournie par le module smtplib pour envoyer le rapport de test au format html. Le processus de base consiste à lire le rapport de test -> ajouter le contenu de l'e-mail et les pièces jointes -> se connecter au serveur de messagerie -> envoyer un e-mail -> quitter. L'exemple de code est le suivant :
-
- import smtplib
-
- from email.mime.text import MIMEText
-
- from email.mime.multipart import MIMEMultipart
-
-
- def send_mail():
-
- # 读取测试报告内容
-
- with open(report_file, 'r') as f:
-
- content = f.read().decode('utf-8')
-
-
- msg = MIMEMultipart('mixed')
-
- # 添加邮件内容
-
- msg_html = MIMEText(content, 'html', 'utf-8')
-
- msg.attach(msg_html)
-
-
- # 添加附件
-
- msg_attachment = MIMEText(content, 'html', 'utf-8')
-
- msg_attachment["Content-Disposition"] = 'attachment; filename="{0}"'.format(report_file)
-
- msg.attach(msg_attachment)
-
-
- msg['Subject'] = mail_subjet
-
- msg['From'] = mail_user
-
- msg['To'] = ';'.join(mail_to)
-
- try:
-
- # 连接邮件服务器
-
- s = smtplib.SMTP(mail_host, 25)
-
- # 登陆
-
- s.login(mail_user, mail_pwd)
-
- # 发送邮件
-
- s.sendmail(mail_user, mail_to, msg.as_string())
-
- # 退出
-
- s.quit()
-
- except Exception as e:
-
- print "Exceptioin ", e
Ouvrez le rapport de test généré après l'exécution de nosetests. Vous pouvez voir qu'un total de 51 cas de test ont été exécutés dans ce test, dont 50 ont réussi et un a échoué.
Dans le cas d'utilisation ayant échoué, vous pouvez voir que les paramètres transmis sont : {"count": -10, "tag": "Comedy"}, et le nombre de résultats renvoyés à ce moment est incohérent avec nos résultats attendus (lorsque count est un nombre négatif, le résultat attendu est L'interface signale une erreur ou utilise la valeur par défaut de 20, mais le nombre réel de résultats renvoyés est de 189. Dépêchez-vous et signalez le bug à Douban - -)
7. Scénario complet
J'ai téléchargé le script de test automatisé complet de l'interface de recherche de films Douban sur GitHub. Adresse de téléchargement : test_demo/test_douban chez master · lovesoo/test_demo · GitHub
Une fois le téléchargement terminé, utilisez la commande suivante pour effectuer des tests complets d'automatisation de l'interface et envoyer le rapport de test final par e-mail :
test python_doubanSearch.py
Enfin, envoyez l'e-mail du rapport de test, la capture d'écran est la suivante
Enfin, je voudrais remercier tous ceux qui lisent attentivement mon article. La réciprocité est toujours nécessaire. Même si ce n'est pas une chose très précieuse, si vous pouvez l'utiliser, vous pouvez la prendre directement :
Ces informations devraient être l'entrepôt de préparation le plus complet et le plus complet pour les amis [des tests de logiciels] Cet entrepôt a également accompagné des dizaines de milliers d'ingénieurs de test dans le voyage le plus difficile. J'espère qu'il pourra également vous aider !