minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. O que é teste de interface?
Como o nome sugere, teste de interface consiste em testar a interface entre sistemas ou componentes, principalmente para verificar a troca de dados, processos de gerenciamento de transferência e controle e dependências lógicas mútuas. Os protocolos de interface são divididos em HTTP, WebService, Dubbo, Thrift, Socket e outros tipos. Os tipos de teste são divididos principalmente em testes funcionais, testes de desempenho, testes de estabilidade, testes de segurança, etc.
No modelo "pirâmide" de testes em camadas, os testes de interface pertencem à segunda camada de testes de integração de serviços. Em comparação com os testes automatizados da camada de UI (principalmente WEB ou APP), os testes automatizados de interface têm maiores benefícios, são fáceis de implementar, têm baixos custos de manutenção e têm uma relação de entrada-saída mais alta. testes automatizados.
Abaixo, tomamos uma interface HTTP como exemplo para apresentar completamente o processo de teste de automação de interface: da análise de requisitos ao design de casos de uso, da escrita de scripts, execução de testes até a análise de resultados, e fornecemos design completo de casos de uso e scripts de teste.
2. Processo básico
O processo de teste automatizado da função básica da interface é o seguinte:
Análise de requisitos->Design de caso de uso->Desenvolvimento de script->Execução de teste->Análise de resultados
2.1 Interface de amostra
Nome da interface: pesquisa de filmes Douban
Endereço do documento da interface: https://developers.douban.com/wiki/?title=movie_v2#search
Exemplo de chamada de interface:
1) Pesquise por elenco e equipe técnica: https://api.douban.com/v2/movie/search?q=Zhang Yimou
2) Pesquise pelo título do filme: https://api.douban.com/v2/movie/search?q=西游之西游
3) Pesquise por gênero: https://api.douban.com/v2/movie/search?tag=comedy
3. Análise de necessidades
A análise de requisitos refere-se a documentos como requisitos e design. Com base na compreensão dos requisitos, também é necessário compreender a lógica de implementação interna e, nesta fase, podem ser apontados aspectos irracionais ou omitidos dos requisitos e do design.
Por exemplo: interface de pesquisa de filmes Douban, o requisito que entendo é oferecer suporte à pesquisa de títulos de filmes, membros do elenco e tags, e retornar os resultados da pesquisa em páginas.
4. Design de caso de uso
O design do caso de uso é baseado na compreensão dos requisitos de teste da interface e no uso de software de mapeamento mental, como MindManager ou XMind, para escrever o design do caso de teste. O conteúdo principal inclui verificação de parâmetros, verificação de função, verificação de cenário de negócios, verificação de segurança e desempenho, etc. os métodos de design de casos de uso incluem divisão de classe de equivalência, análise de valor limite, análise de cenário, diagramas de causa e efeito, tabelas ortogonais, etc.
Para a parte de teste de função da interface de pesquisa de filmes Douban, nos concentramos principalmente em três aspectos: verificação de parâmetros, verificação de função e verificação de cenário de negócios. Os exemplos de teste de design são os seguintes:
Com base no design do caso de teste escrito acima, usamos a estrutura python+nosetests para escrever scripts de teste automatizados relevantes. Ele pode realizar totalmente as funções de teste automatizado de interface, execução automática e envio de relatórios de teste por e-mail.
As bibliotecas lib necessárias são as seguintes. Você pode instalá-las usando o comando pip:
-
- pip install nose
-
- pip install nose-html-reporting
-
- pip install requests
Usando a biblioteca de solicitações, podemos escrever facilmente o método de chamada de interface acima (como pesquisar por q=Andy Lau, o código de exemplo é o seguinte):
-
- #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)
Ao escrever scripts de teste automatizados, precisamos realizar algum encapsulamento. No código a seguir, encapsulamos a interface de pesquisa de filmes Douban. O método test_q só precisa usar o método yield fornecido por nosetests para percorrer convenientemente cada conjunto de testes na lista 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,)
Podemos escrever scripts de teste automatizados para cada função em sequência, de acordo com o design do caso de teste.
5.3 Verificação de resultados
Ao testar a interface manualmente, precisamos avaliar se o teste foi aprovado com base nos resultados retornados pela interface. O mesmo se aplica aos testes automatizados.
Para esta interface, procuramos por “q=Andy Lau” e precisamos determinar se os resultados retornados contêm “ator Andy Lau ou título de filme Andy Lau”. Ao pesquisar por “tag=comedy”, precisamos determinar o tipo de”. filme nos resultados retornados Seja "comédia", é necessário verificar se o número de resultados retornados está correto ao paginar os resultados, etc. O código completo de verificação do resultado é o seguinte:
-
- 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'])))
Para o script de teste acima, podemos usar o comando nosetests para executar testes automatizados facilmente e usar o plug-in nose-html-reporting para gerar relatórios de teste em formato html.
Execute o comando da seguinte maneira:
nosetests -v test_doubanSearch.py:test_doubanSearch --with-html --html-report=TestReport.html
Após a conclusão do teste, podemos usar o método fornecido pelo módulo smtplib para enviar o relatório de teste em formato html. O processo básico é ler o relatório de teste -> adicionar conteúdo e anexos de e-mail -> conectar-se ao servidor de e-mail -> enviar e-mail -> sair.
-
- 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
Abra o relatório de teste gerado após a execução do nosetests. Pode-se observar que um total de 51 casos de teste foram executados neste teste, 50 dos quais foram bem-sucedidos e um deles falhou.
No caso de uso com falha, você pode ver que os parâmetros passados são: {"count": -10, "tag": "Comedy"}, e o número de resultados retornados neste momento é inconsistente com nossos resultados esperados (quando count é um número negativo, o resultado esperado é A interface relata um erro ou usa o valor padrão de 20, mas o número real de resultados retornados é 189. Apresse-se e relate o bug para Douban - -)
7. Roteiro completo
Carreguei o script de teste automatizado completo da interface de pesquisa de filmes Douban para o GitHub. Endereço para download: test_demo/test_douban em master · loveoo/test_demo · GitHub
Após a conclusão do download, use o seguinte comando para realizar o teste completo de automação da interface e enviar o relatório final do teste por e-mail:
python teste_doubanSearch.py
Por fim, envie o e-mail do relatório de teste, a captura de tela é a seguinte
Por fim, gostaria de agradecer a todos que lêem meu artigo com atenção. A reciprocidade é sempre necessária. Embora não seja algo muito valioso, se você puder usá-lo, poderá aproveitá-lo diretamente.
Esta informação deve ser o armazém de preparação mais abrangente e completo para amigos [de teste de software]. Este armazém também acompanhou dezenas de milhares de engenheiros de teste na jornada mais difícil.