A estrutura de teste de unidade que acompanha o Python é o módulo unittest, que inclui alguns métodos para verificar os resultados retornados e algumas operações de inicialização antes da execução do caso de uso;
TestCase é o caso de teste
TestSuite vários casos de teste juntos
TestLoader é usado para carregar TestCase no TestSuite
TestRunner é usado para executar casos de teste e os resultados do teste serão salvos na instância TestResult, incluindo quantos casos de teste foram executados, quantos foram bem-sucedidos e quantos falharam.
Caso de teste unitário simples:
import unittest
def calc(x,y):
return x+y
class TestCalc(unittest.TestCase):
def test_pass_case(self):
'''这个是通过测试用例'''
print('这个是通过测试用例!')
res=calc(1,2)
self.assertEqual(3,res)
self.assertNotEqual(4,res)#返回的结果不一样
def test_a(self):
'''这个是普通的测试用例'''
print('a')
def test_fail_case(self):
'''这个是失败的测试用例'''
print('这个是失败的测试用例')
res=calc(3,4)
self.assertEqual(8,res)
if __name__=='__main__':
unittest.main()#运行所有的测试用例
import unittest
def calc(x,y):
return x+y
class TestCalc(unittest.TestCase):
def test_pass_case(self):
'''这个是通过测试用例'''
print('这个是通过测试用例!')
res=calc(1,2)
self.assertEqual(3,res)
self.assertNotEqual(4,res)#返回的结果不一样
def setUp(self):
#每个用例运行之前都会执行它
print('我是setup')
def tearDown(self):
#每个用例运行完之后都会执行它
print('我是tearDown')
@classmethod
def setUpClass(cls):
#所有的用例执行之前执行一次
print('我是setupClass')
@classmethod
def tearDownClass(cls):
#所有用例都运行完之后执行一次
print('我是tearDownClass')
def test_a(self):
'''这个是普通的测试用例'''
print('a')
def test_fail_case(self):
'''这个是失败的测试用例'''
print('这个是失败的测试用例')
res=calc(3,4)
self.assertEqual(8,res)
def test_haha(self):
'''哈哈哈'''
self.assertEqual(1,2)
if __name__=='__main__':
unittest.main()
Para gerar um relatório de teste, você precisa adicionar outro módulo: HTMLTestRunner. Este módulo precisa ser instalado por você mesmo. Após a execução do caso de teste, será gerado um relatório de teste html, e haverá os resultados da execução de cada caso de teste:
Copie o arquivo HTMLTestRunner.py para External Libraries—>site-packages in pycharm
import unittest,HTMLTestRunner
def calc(x,y):
return x+y
class TestCalc(unittest.TestCase):
def test_pass_case(self):
'''这个是通过测试用例'''
print('这个是通过测试用例!')
res=calc(1,2)
self.assertEqual(3,res)
self.assertNotEqual(4,res)#返回的结果不一样
def setUp(self):
#每个用例运行之前都会执行它
print('我是setup')
def tearDown(self):
#每个用例运行完之后都会执行它
print('我是tearDown')
@classmethod
def setUpClass(cls):
#所有的用例执行之前执行一次
print('我是setupClass')
@classmethod
def tearDownClass(cls):
#所有用例都运行完之后执行一次
print('我是tearDownClass')
def test_a(self):
'''这个是普通的测试用例'''
print('a')
def test_fail_case(self):
'''这个是失败的测试用例'''
print('这个是失败的测试用例')
res=calc(3,4)
self.assertEqual(8,res)
def test_haha(self):
'''哈哈哈'''
self.assertEqual(1,2)
if __name__=='__main__':
suite=unittest.TestSuite()#定义一个测试套件
suite.addTest(TestCalc('test_pass_case'))#测试套件中添加测试用例
suite.addTest(TestCalc('test_a'))
suite.addTest(TestCalc('test_fail_case'))
f=open('report.html','wb')#打开一个测试报告的文件
runner=HTMLTestRunner.HTMLTestRunner(stream=f,title='wei测试结果',description='描述')#生成执行用例的对象
runner.run(suite)#执行测试套件
import unittest,HTMLTestRunner
def calc(x,y):
return x+y
class TestCalc(unittest.TestCase):
def test_pass_case(self):
'''这个是通过测试用例'''
print('这个是通过测试用例!')
res=calc(1,2)
self.assertEqual(3,res)
self.assertNotEqual(4,res)#返回的结果不一样
def setUp(self):
#每个用例运行之前都会执行它
print('我是setup')
def tearDown(self):
#每个用例运行完之后都会执行它
print('我是tearDown')
@classmethod
def setUpClass(cls):
#所有的用例执行之前执行一次
print('我是setupClass')
@classmethod
def tearDownClass(cls):
#所有用例都运行完之后执行一次
print('我是tearDownClass')
def test_a(self):
'''这个是普通的测试用例'''
print('a')
def test_fail_case(self):
'''这个是失败的测试用例'''
print('这个是失败的测试用例')
res=calc(3,4)
self.assertEqual(8,res)
def test_haha(self):
'''哈哈哈'''
self.assertEqual(1,2)
if __name__=='__main__':
suite=unittest.TestSuite()#定义一个测试套件
suite.addTest(unittest.makeSuite(TestCalc))#这个类里面的所有测试用例
f=open('report.html','wb')#打开一个测试报告的文件
runner=HTMLTestRunner.HTMLTestRunner(stream=f,title='wei测试结果',description='描述')#生成执行用例的对象
runner.run(suite)#执行测试套件
BeautifulReport: Igual ao HTMLTestRunner, porém o relatório gerado é mais bonito e detalhado. Descompacte o arquivo BeautifulReport e copie-o para External Libraries—>site-packages in pycharm
import unittest
from BeautifulReport import BeautifulReport
def calc(x,y):
return x+y
class TestCalc(unittest.TestCase):
def test_pass_case(self):
'''这个是通过测试用例'''
print('这个是通过测试用例!')
res=calc(1,2)
self.assertEqual(3,res)
self.assertNotEqual(4,res)#返回的结果不一样
def setUp(self):
#每个用例运行之前都会执行它
print('我是setup')
def tearDown(self):
#每个用例运行完之后都会执行它
print('我是tearDown')
@classmethod
def setUpClass(cls):
#所有的用例执行之前执行一次
print('我是setupClass')
@classmethod
def tearDownClass(cls):
#所有用例都运行完之后执行一次
print('我是tearDownClass')
def test_a(self):
'''这个是普通的测试用例'''
print('a')
def test_fail_case(self):
'''这个是失败的测试用例'''
print('这个是失败的测试用例')
res=calc(3,4)
self.assertEqual(8,res)
def test_haha(self):
'''哈哈哈'''
self.assertEqual(1,2)
if __name__=='__main__':
suite=unittest.TestSuite()#定义一个测试套件
suite.addTest(unittest.makeSuite(TestCalc))#这个类里面的所有测试用例
result=BeautifulReport(suite)
result.report(filename='xiaoReport',description='描述',log_path='.')
Execute casos que não estejam no mesmo arquivo .py:
cases:同一个目录下的文件夹,包含三个python文件 test_buy,test_login,test_reg
import unittest
class TestBuy(unittest.TestCase):
def test_a(self):
self.assertEqual(1,1)
def test_b(self):
self.assertEqual(1,2)
class TestBuy2(unittest.TestCase):
def test_buy_phone(self):
self.assertEqual(1,1)
import unittest
class TestLogin(unittest.TestCase):
def test_a(self):
self.assertEqual(1,1)
def test_b(self):
self.assertEqual(1,2)
import unittest
class TestReg(unittest.TestCase):
def test_a(self):
self.assertEqual(1,1)
def test_b(self):
self.assertEqual(1,2)
class TestReg2(unittest.TestCase):
def test_buy_phone(self):
self.assertEqual(1,1)
O arquivo run_all_cases.py testa para executar os casos de teste acima:
import unittest
from BeautifulReport import BeautifulReport
suite=unittest.TestSuite()
all_case=unittest.defaultTestLoader.discover('cases','test_*.py')
[suite.addTest(case) for case in all_case]
result=BeautifulReport(suite)
result.report(filename='Bea测试报告',description='描述',log_path='.')
Na integração contínua subsequente, o Jenkins será usado para executar o código automaticamente, mas o Jenkins não reconhece os relatórios de teste no formato html. Portanto, é necessário gerar um relatório de teste em um formato que o Jenkins reconheça, formato xml. Tudo o que você precisa para usar o módulo xmlrunner, apenas pip install xmlrunner diretamente:
1 import unittest
2 import xmlrunner#为了以后给Jenkins看
3 suite=unittest.TestSuite()
4 all_case=unittest.defaultTestLoader.discover('cases','test_*.py')
5 # for case in all_case:
6 # suite.addTest(case)
7 [suite.addTest(case) for case in all_case]#列表生成式,和上面代码是一样的
8 runner=xmlrunner.XMLTestRunner('.')#这是是为了产生报告给Jenkins看
#runner=xmlrunner.XMLTestRunner(output='report1')#指定生成目录
9 runner.run(suite)#运行用例
Se você estiver interessado em teste de software, quiser saber mais sobre o conhecimento de teste, resolver problemas de teste e obter orientações para ajudá-lo a resolver a confusão encontrada nos testes, temos especialistas técnicos aqui. Se você está procurando emprego ou acabou de se formar na escola, ou já trabalhou, mas muitas vezes sente que é muito difícil, sente que não é bom o suficiente no teste, quer continuar seus estudos ou quer mudar de carreira e tem medo de não ser capaz de aprender, você pode se juntar a nós
. Obtenha os mais recentes materiais de entrevista de fábrica de teste de software e automação de Python, interface, materiais de aprendizado de construção de estrutura!