Condivisione della tecnologia

Cos'è il test dell'interfaccia e come lo implementiamo?

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Cos'è il test dell'interfaccia?
Come suggerisce il nome, il test dell'interfaccia consiste nel testare l'interfaccia tra sistemi o componenti, principalmente per verificare lo scambio di dati, i processi di gestione del trasferimento e del controllo e le reciproche dipendenze logiche. I protocolli di interfaccia sono suddivisi in HTTP, WebService, Dubbo, Thrift, Socket e altri tipi. I tipi di test sono principalmente suddivisi in test funzionali, test delle prestazioni, test di stabilità, test di sicurezza, ecc.

Nel modello "piramidale" di test a più livelli, il test dell'interfaccia appartiene al secondo livello del test di integrazione del servizio. Rispetto ai test automatizzati del livello UI (principalmente WEB o APP), i test automatizzati dell'interfaccia presentano maggiori vantaggi, sono facili da implementare, hanno bassi costi di manutenzione e hanno un rapporto input-output più elevato. È la prima scelta da eseguire per ogni azienda test automatizzati.

Di seguito prendiamo un'interfaccia HTTP come esempio per introdurre in modo completo il processo di test di automazione dell'interfaccia: dall'analisi dei requisiti alla progettazione del caso d'uso, dalla scrittura dello script, dall'esecuzione del test all'analisi dei risultati, e fornire una progettazione completa del caso d'uso e script di test.

2. Processo di base
Il processo di test automatizzato delle funzioni di base dell'interfaccia è il seguente:

Analisi dei requisiti->Progettazione dei casi d'uso->Sviluppo di script->Esecuzione del test->Analisi dei risultati

2.1 Interfaccia di esempio
Nome dell'interfaccia: ricerca film Douban

Indirizzo del documento di interfaccia: https://developers.douban.com/wiki/?title=movie_v2#search

Esempio di chiamata dell'interfaccia:

1) Ricerca per cast e troupe: https://api.douban.com/v2/movie/search?q=Zhang Yimou

2) Cerca per titolo del film: https://api.douban.com/v2/movie/search?q=西游之西游

3) Ricerca per genere: https://api.douban.com/v2/movie/search?tag=comedy


3. Analisi dei bisogni
L'analisi dei requisiti si riferisce a documenti come requisiti e progettazione. Sulla base della comprensione dei requisiti, è anche necessario comprendere la logica di implementazione interna e, in questa fase, possono essere evidenziati requisiti e progetti irragionevoli o omessi.

Ad esempio: interfaccia di ricerca di film Douban, il requisito che capisco è supportare la ricerca di titoli di film, membri del cast e tag e restituire i risultati della ricerca in pagine.

4. Progettazione del caso d'uso
La progettazione dei casi d'uso si basa sulla comprensione dei requisiti di test dell'interfaccia e sull'utilizzo di software di mappatura mentale come MindManager o XMind per scrivere la progettazione dei casi di test. Il contenuto principale include la verifica dei parametri, la verifica delle funzioni, la verifica dello scenario aziendale, la verifica della sicurezza e delle prestazioni, ecc. Comunemente utilizzato I metodi di progettazione dei casi d'uso includono la divisione delle classi di equivalenza, l'analisi dei valori limite, l'analisi degli scenari, i diagrammi causa-effetto, le tabelle ortogonali, ecc.

Per la parte di test delle funzioni dell'interfaccia di ricerca di film Douban, ci concentriamo principalmente su tre aspetti: verifica dei parametri, verifica delle funzioni e verifica dello scenario aziendale. Gli esempi di test di progettazione sono i seguenti:

5. Sviluppo della sceneggiatura

Sulla base della progettazione del test case scritta sopra, abbiamo utilizzato il framework python+nosetests per scrivere script di test automatizzati pertinenti. Può realizzare pienamente le funzioni di test automatizzato dell'interfaccia, esecuzione automatica e invio e-mail di rapporti di test.

5.1 Installazione della libreria correlata

Le librerie lib necessarie sono le seguenti. Puoi installarle utilizzando il comando pip:

  1. pip install nose
  2. pip install nose-html-reporting
  3. pip install requests

5.2 Chiamata d'interfaccia

Utilizzando la libreria delle richieste, possiamo facilmente scrivere il metodo di chiamata dell'interfaccia sopra (come cercare q=Andy Lau, il codice di esempio è il seguente):

  1. #coding=utf-8
  2. import requests
  3. import json
  4. url = 'https://api.douban.com/v2/movie/search'
  5. params=dict(q=u'刘德华')
  6. r = requests.get(url, params=params)
  7. print 'Search Params:n', json.dumps(params, ensure_ascii=False)
  8. print 'Search Response:n', json.dumps(r.json(), ensure_ascii=False, indent=4)

Quando scriviamo effettivamente script di test automatizzati, dobbiamo eseguire un po' di incapsulamento. Nel codice seguente, incapsuliamo l'interfaccia di ricerca dei film Douban. Il metodo test_q deve solo utilizzare il metodo yield fornito da nosetests per scorrere comodamente ogni set di test nell'elenco qs:

  1. class test_doubanSearch(object):
  2. @staticmethod
  3. def search(params, expectNum=None):
  4. url = 'https://api.douban.com/v2/movie/search'
  5. r = requests.get(url, params=params)
  6. print 'Search Params:n', json.dumps(params, ensure_ascii=False)
  7. print 'Search Response:n', json.dumps(r.json(), ensure_ascii=False, indent=4)
  8. def test_q(self):
  9. # 校验搜索条件 q
  10. qs = [u'白夜追凶', u'大话西游', u'周星驰', u'张艺谋', u'周星驰,吴孟达', u'张艺谋,巩俐', u'周星驰,大话西游', u'白夜追凶,潘粤明']
  11. for q in qs:
  12. params = dict(q=q)
  13. f = partial(test_doubanSearch.search, params)
  14. f.description = json.dumps(params, ensure_ascii=False).encode('utf-8')
  15. yield (f,)

Possiamo scrivere script di test automatizzati per ciascuna funzione in sequenza in base alla progettazione del test case.

5.3 Verifica dei risultati
Quando testiamo l'interfaccia manualmente, dobbiamo giudicare se il test passa in base ai risultati restituiti dall'interfaccia. Lo stesso vale per i test automatizzati.

Per questa interfaccia, cerchiamo "q=Andy Lau" e dobbiamo determinare se i risultati restituiti contengono "attore Andy Lau o titolo del film Andy Lau. Quando cerchiamo "tag=commedia", dobbiamo determinare il tipo di film nei risultati restituiti Che si tratti di "commedia", è necessario verificare se il numero di risultati restituiti è corretto quando si sfogliano i risultati, ecc. Il codice completo di verifica del risultato è il seguente:

  1. class check_response():
  2. @staticmethod
  3. def check_result(response, params, expectNum=None):
  4. # 由于搜索结果存在模糊匹配的情况,这里简单处理只校验第一个返回结果的正确性
  5. if expectNum is not None:
  6. # 期望结果数目不为None时,只判断返回结果数目
  7. eq_(expectNum, len(response['subjects']), '{0}!={1}'.format(expectNum, len(response['subjects'])))
  8. else:
  9. if not response['subjects']:
  10. # 结果为空,直接返回失败
  11. assert False
  12. else:
  13. # 结果不为空,校验第一个结果
  14. subject = response['subjects'][0]
  15. # 先校验搜索条件tag
  16. if params.get('tag'):
  17. for word in params['tag'].split(','):
  18. genres = subject['genres']
  19. ok_(word in genres, 'Check {0} failed!'.format(word.encode('utf-8')))
  20. # 再校验搜索条件q
  21. elif params.get('q'):
  22. # 依次判断片名,导演或演员中是否含有搜索词,任意一个含有则返回成功
  23. for word in params['q'].split(','):
  24. title = [subject['title']]
  25. casts = [i['name'] for i in subject['casts']]
  26. directors = [i['name'] for i in subject['directors']]
  27. total = title + casts + directors
  28. ok_(any(word.lower() in i.lower() for i in total),
  29. 'Check {0} failed!'.format(word.encode('utf-8')))
  30. @staticmethod
  31. def check_pageSize(response):
  32. # 判断分页结果数目是否正确
  33. count = response.get('count')
  34. start = response.get('start')
  35. total = response.get('total')
  36. diff = total - start
  37. if diff >= count:
  38. expectPageSize = count
  39. elif count > diff > 0:
  40. expectPageSize = diff
  41. else:
  42. expectPageSize = 0
  43. eq_(expectPageSize, len(response['subjects']), '{0}!={1}'.format(expectPageSize, len(response['subjects'])))

5.4 Esecuzione dei test

Per lo script di test riportato sopra, possiamo utilizzare il comando nosetests per eseguire facilmente test automatizzati e utilizzare il plug-in nose-html-reporting per generare report di test in formato html.

Esegui il comando come segue:

nosetests -v test_doubanSearch.py:test_doubanSearch --with-html --html-report=TestReport.html

5.5 Invia rapporto via e-mail

Una volta completato il test, possiamo utilizzare il metodo fornito dal modulo smtplib per inviare il report del test in formato html. Il processo di base è leggere il rapporto di test -> aggiungere contenuto e allegati e-mail -> connettersi al server di posta -> inviare e-mail -> esci. Il codice di esempio è il seguente:

  1. import smtplib
  2. from email.mime.text import MIMEText
  3. from email.mime.multipart import MIMEMultipart
  4. def send_mail():
  5. # 读取测试报告内容
  6. with open(report_file, 'r') as f:
  7. content = f.read().decode('utf-8')
  8. msg = MIMEMultipart('mixed')
  9. # 添加邮件内容
  10. msg_html = MIMEText(content, 'html', 'utf-8')
  11. msg.attach(msg_html)
  12. # 添加附件
  13. msg_attachment = MIMEText(content, 'html', 'utf-8')
  14. msg_attachment["Content-Disposition"] = 'attachment; filename="{0}"'.format(report_file)
  15. msg.attach(msg_attachment)
  16. msg['Subject'] = mail_subjet
  17. msg['From'] = mail_user
  18. msg['To'] = ';'.join(mail_to)
  19. try:
  20. # 连接邮件服务器
  21. s = smtplib.SMTP(mail_host, 25)
  22. # 登陆
  23. s.login(mail_user, mail_pwd)
  24. # 发送邮件
  25. s.sendmail(mail_user, mail_to, msg.as_string())
  26. # 退出
  27. s.quit()
  28. except Exception as e:
  29. print "Exceptioin ", e

6. Analisi dei risultati

Aprire il rapporto di test generato dopo l'esecuzione dei nosetest. Si può vedere che in questo test sono stati eseguiti un totale di 51 casi di test, 50 dei quali hanno avuto successo e uno ha fallito.

Nel caso d'uso non riuscito, puoi vedere che i parametri passati sono: {"count": -10, "tag": "Comedy"} e il numero di risultati restituiti in questo momento non è coerente con i risultati previsti (quando count è un numero negativo, il risultato atteso è L'interfaccia segnala un errore o utilizza il valore predefinito di 20, ma il numero effettivo di risultati restituiti è 189. Sbrigati e segnala il bug a Douban - -)

7. Completa la sceneggiatura
Ho caricato su GitHub lo script di test automatizzato completo dell'interfaccia di ricerca di film di Douban. Indirizzo di download: test_demo/test_douban su master · lovesoo/test_demo · GitHub

Al termine del download, utilizzare il comando seguente per eseguire il test completo di automazione dell'interfaccia e inviare il rapporto del test finale via e-mail:

test python_doubanCerca.py
Infine invia l'e-mail del rapporto di prova, lo screenshot è il seguente

Infine, vorrei ringraziare tutti coloro che leggono attentamente il mio articolo La reciprocità è sempre necessaria Anche se non è una cosa molto preziosa, se puoi usarla, puoi prenderla direttamente:

Queste informazioni dovrebbero essere il magazzino di preparazione più completo e completo per gli amici [di test del software] Questo magazzino ha anche accompagnato decine di migliaia di ingegneri di test attraverso il viaggio più difficile.