ユニットテストについて話しましょう

Pythonに付属する単体テストフレームワークはunittestモジュールであり、ユースケースの実行前に返された結果を検証するためのいくつかのメソッドといくつかの初期化操作が含まれています。

TestCaseはテストケースです

TestSuiteの複数のテストケースを一緒に

TestLoaderは、TestCaseをTestSuiteにロードするために使用されます

TestRunnerはテストケースの実行に使用され、実行されたテストケースの数、成功した数、失敗した数などのテスト結果がTestResultインスタンスに保存されます。

単純な単体テストケース:

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()

テストレポートを生成するには、HTMLTestRunnerという別のモジュールを追加する必要があります。このモジュールは自分でインストールする必要があります。テストケースの実行後、htmlテストレポートが生成され、各テストケースの実行結果が表示されます。

HTMLTestRunner.pyファイルを外部ライブラリにコピーします—>pycharmのsite-packages

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:HTMLTestRunnerと同じですが、生成されるレポートはより美しく、より詳細です。BeautifulReportファイルを解凍し、外部ライブラリ->pycharmのsite-packagesにコピーします

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='.')

同じ.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)

run_all_cases.pyファイルは、上記のテストケースを実行するためにテストします。

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='.')

その後の継続的インテグレーションでは、Jenkinsを使用してコードが自動的に実行されますが、Jenkinsはhtml形式のテストレポートを認識しません。したがって、Jenkinsが認識できる形式(xml形式)でテストレポートを生成する必要があります。xmlrunnerモジュールを使用するために必要なのは、xmlrunnerを直接pipインストールするだけです。

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)#运行用例

ここに画像の説明を挿入
ソフトウェアテストに興味があり、テストの知識についてもっと知りたい、テストの問題を解決したい、テストで遭遇した混乱を解決するのに役立つガイダンスを開始したい場合は、ここに技術専門家がいます。仕事を探している、学校を卒業したばかり、またはすでに働いているが非常に難しいと感じることが多い場合、テストで十分ではないと感じている、勉強を続けたい、または転職したい、学ぶことができないのではないかと心配しています。ぜひご参加くださいここに画像の説明を挿入
。最新のソフトウェアテストファクトリーのインタビュー資料とPyt​​honの自動化、インターフェース、フレームワーク構築の学習資料を入手してください。

おすすめ

転載: blog.csdn.net/qq_42434318/article/details/113618341