python - Como você gerar (parametrizada) testes de unidade dinâmicos em python? - CoreDump.pt
Como você gerar (parametrizada) testes de unidade dinâmicos em python?
Eu tenho algum tipo de dados de teste e quer criar um teste de unidade para cada item. Minha primeira idéia era fazê-lo como este:
A desvantagem desta situação é que ele lida com todos os dados em um teste. Eu gostaria de gerar um teste para cada item na mosca. Alguma sugestão?
Publicado 28/08/2008 em 18:49 2008-08-28 18:49
i usar algo como isto:
O nose-parameterizedpacote pode ser usado para automatizar esse processo:
O que irá gerar os testes:
Respondeu 28/08/2008 em 19:02 2008-08-28 19:02 share
O nariz framework de testes suporta este .
Exemplo (o código abaixo é todo o conteúdo do ficheiro contendo o teste):
A saída do comando nosetests:
ATUALIZAÇÃO - unittest apoio desde 3.4:
Desde Python 3.4, a biblioteca padrão unittestpacote tem o subTestgerente de contexto, permitindo funcionalidade semelhante usando unittestsomente.
26.4.7. iterações de ensaio distintivas usando subensaios
Você também pode especificar uma mensagem personalizada e os valores de parâmetro para subTest():
Respondeu 29/08/2008 em 08:10 2008-08-29 08:10 share
Isso pode ser resolvido com elegância usando Metaclasses:
Respondeu 01/01/2014 em 17:52 2014-01-01 17:52 share
A partir de Python 3.4 subtestes foram introduzidas para UnitTest para esta finalidade. Veja a documentação para mais detalhes. TestCase.subTest é um gerenciador de contexto que permite isolar afirma em um teste para que uma falha será relatado com informações de parâmetro, mas não parar a execução do teste. Aqui está o exemplo da documentação:
A saída de um teste seria:
Isso também faz parte da unittest2 , para que esteja disponível para versões anteriores do Python.
Respondeu 01/04/2015 em 06:46 2015-04-01 06:46 share
fonte usuário Bernhard
load_tests é um pouco mecanismo conhecido introduzido em 2,7 para criar dinamicamente um TestSuite. Com ele, você pode facilmente criar testes parametrizadas.
Esse código irá executar todos os TestCases no TestSuite retornado por load_tests. Não há outros testes são executados automaticamente pelo mecanismo de descoberta.
Alternativamente, você também pode usar a herança como mostra este bilhete: http://bugs.python.org/msg151444
Respondeu 07/05/2014 em 04:55 2014-05-07 04:55 share
Isso pode ser feito usando pytest . Basta escrever o arquivo test_me.pycom o conteúdo:
E executar o teste com o comando py.test --tb=short test_me.py. Então, a saída será parece:
It !. simples Também pytest tem mais recursos, como fixtures, mark, assert, etc ...
Respondeu 02/09/2014 em 16:08 2014-09-02 16:08 share
fonte usuário Sergey Voronezhskiy
Use o ddt biblioteca. Acrescenta decoradores simples para os métodos de ensaio:
Esta biblioteca pode ser instalado com pip. Ele não requer nose, e funciona excelente com a biblioteca padrão unittestmódulo.
Respondeu 21/04/2015 em 08:24 2015-04-21 08:24 share
fonte usuário Mykhaylo Kopytonenko
Você se beneficiaria de tentar o TestScenarios biblioteca.
testscenarios fornece injecção dependência limpo para testes de estilo python unittest. Isto pode ser utilizado para testes de interface (testando muitas implementações através de um único conjunto de teste) ou por injecção dependência clássico (proporcionam testes com dependências externamente ao próprio código de teste, permitindo o fácil ensaio em situações diferentes).
Respondeu 01/05/2009 em 04:59 2009-05-01 04:59 share
fonte usuário bignose
Há também Hipótese que acrescenta Fuzzing ou propriedade com base: https://pypi.python.org/pypi/hypothesis
Este é um método de teste muito poderoso.
Respondeu 24/11/2015 em 02:00 2015-11-24 02:00 share
Você pode usar nariz-ittr plug-in ( pip install nose-ittr).
É muito fácil de integrar com os testes existentes, alterações mínimas (se houver) são obrigatórios. Ele também suporta nariz multiprocessamento plugin.
Não é que você também pode ter um customize setupfunção por teste.
Também é possível passar nosetestparâmetros como com o seu plugin build-in attrib, desta forma você pode executar apenas um teste específico com o parâmetro específico:
Respondeu 02/12/2014 em 13:39 2014-12-02 13:39 share
fonte usuário Maroun
Eu uso metaclasses e decoradores para gerar testes. Você pode verificar minha implementação python_wrap_cases . Esta biblioteca não requer quaisquer estruturas de teste.
Além disso, você pode usar geradores . Por exemplo, este código de gerar todas as possíveis combinações de testes com argumentos a__listeb__list
Respondeu 01/07/2015 em 12:28 2015-07-01 12:28 share
Me deparei com ParamUnittest no outro dia quando se olha para o código fonte para o radão ( exemplo de uso no repo github ). Ele deve funcionar com outras estruturas que se estendem TestCase (como nariz).
Respondeu 06/03/2015 em 01:21 2015-03-06 01:21 share
Respondeu 07/12/2016 em 06:10 2016-12-07 06:10 share
fonte usuário Arindam Roychowdhury
Você pode usar TestSuitee personalizados TestCaseclasses.
Respondeu 20/12/2015 em 15:41 2015-12-20 15:41 share
fonte usuário Max Malysh
Basta utilizar metaclasses, como visto aqui;
Respondeu 10/05/2015 em 11:43 2015-05-10 11:43 share
fonte usuário sleepycal
Super atrasado para a festa, mas tive problemas para fazer esses trabalhos para setUpClass.
Aqui está uma versão de @ resposta de Javier , que dá setUpClassacesso a atributos alocados dinamicamente.
fonte usuário hhquark
Meta-programação é divertido, mas pode ficar no caminho. A maioria das soluções aqui tornam difícil:
iniciar selectivamente um teste
apontar para o nome do teste de código dado
Então, minha primeira sugestão é seguir o caminho simples / explícita (funciona com qualquer corredor de teste):
Uma vez que não deve repetir-nos, minha segunda sugestão baseia-se na resposta da @ Javier: abraçar testes baseados propriedade. biblioteca hipótese:
é "mais implacavelmente desonesto sobre o teste de geração de casos do que nós, meros seres humanos"
irá fornecer contagem de exemplos simples
funciona com qualquer corredor de teste
tem muitos mais interessante características (estatísticas, saída de teste adicional, ...)
TestSequence classe (unittest.TestCase):
Para testar seus exemplos específicos, basta adicionar:
Para executar apenas um exemplo particular, pode comentar os outros exemplos (desde exemplo será executado em primeiro lugar). Você pode querer usar @given(st.nothing()). Outra opção é substituir todo o bloco por:
Ok, você não tem nomes de teste distintas. Mas talvez você só precisa:
um nome descritivo da propriedade em teste.
que de entrada leva à falha (falsificar exemplo).
exemplo mais engraçado
Respondeu 08/08/2017 em 13:59 2017-08-08 13:59 share
fonte usuário YvesgereY
As respostas baseadas em metaclasse ainda trabalhar em Python3, mas em vez do __metaclass__atributo tem de se usar o metaclassparâmetro, como em:
Respondeu 08/05/2017 em 15:25 2017-05-08 15:25 share
fonte usuário Patrick Ohly
Esta solução funciona com unitteste nose:
Respondeu 06/09/2016 em 13:57 2016-09-06 13:57 share
fonte usuário mop
Eu estava tendo problemas com um estilo muito particular de testes com parâmetros. Todos os nossos testes de selênio pode ser executado localmente, mas também deve ser capaz de ser executado remotamente em várias plataformas on SauceLabs. Basicamente, eu queria tirar uma grande quantidade de casos de teste já escritas e parametrizar-los com o menor número de alterações de código possível. Além disso, eu precisava ser capaz de passar os parâmetros para o método de configuração, algo que eu não vi nenhuma solução para outro lugar.
Com isso, tudo o que eu tinha a fazer era adicionar um simples @sauce_labs decorador () para cada TestCase de idade regular, e agora, quando executá-los, eles estão embrulhados e reescrito, para que todos os métodos de ensaio são parametrizados e renomeado. LoginTests.test_login (self) é executado como LoginTests.test_login_internet_explorer_10.0 (self), LoginTests.test_login_internet_explorer_11.0 (self) e LoginTests.test_login_firefox_43.0 (self), e cada um tem o self.platform parâmetro para decidir o navegador / plataforma para executar contra, mesmo em LoginTests.setUp, que é crucial para a minha tarefa já que é onde a conexão com SauceLabs é inicializado.
De qualquer forma, espero que este pode ser de ajuda para alguém que olha para fazer uma parametrização similar "global" de seus testes!
Respondeu 22/04/2016 em 08:02 2016-04-22 08:02 share
fonte usuário Danielle Weisz
A seguir é a minha solução. I encontrar este útil quando: 1. Deve trabalhar para unittest.TestCase e unittest descobrir 2. Ter um conjunto de testes a serem executados para diferentes ajustes de parâmetros. 3. Muito simples nenhuma dependência de outros pacotes importar unittest
Respondeu 02/08/2016 em 16:35 2016-08-02 16:35 share
fonte usuário S.Arora
Além de usar setattr, podemos usar load_tests desde python 3.2. Consulte a postagem no blog blog.livreuro.com/en/coding/python/how-to-generate-discoverable-unit-tests-in-python-dynamically/
Respondeu 26/05/2016 em 20:20 2016-05-26 20:20 share
fonte usuário pptime
Scripts de manutenção com objetos Pilões?
modelos balão de sqlalchemy importar problemm
Como usar um refresh_token para obter um novo access_token (usando balão de OAuthLib)?
É errado usar o operador "==", quando comparado com uma lista vazia?
Python TypeError: nem todos os argumentos convertido durante a formatação corda, ao passar parâmetro para uma consulta PostgreSQL