Khung UnitTest - API
Chương này thảo luận về các lớp và phương thức được định nghĩa trong mô-đun đơn nhất. Có năm lớp chính trong mô-đun này.
Lớp TestCase
Đối tượng của lớp này đại diện cho đơn vị nhỏ nhất có thể kiểm tra được. Nó nắm giữ các quy trình kiểm tra và cung cấp các móc để chuẩn bị từng quy trình và để dọn dẹp sau đó.
Các phương thức sau được định nghĩa trong lớp TestCase:
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | setUp() Phương pháp được gọi để chuẩn bị vật cố định thử nghiệm. Điều này được gọi ngay lập tức trước khi gọi phương thức kiểm tra |
2 | tearDown() Phương thức được gọi ngay sau khi phương thức thử được gọi và kết quả được ghi lại. Điều này được gọi ngay cả khi phương pháp thử nghiệm đưa ra một ngoại lệ, |
3 | setUpClass() Một phương thức lớp được gọi trước khi chạy các bài kiểm tra trong một lớp riêng lẻ. |
4 | tearDownClass() Một phương thức lớp được gọi sau khi các bài kiểm tra trong một lớp riêng lẻ đã chạy. |
5 | run(result = None) Chạy thử nghiệm, thu thập kết quả vào đối tượng kết quả thử nghiệm được thông qua kết quả . |
6 | skipTest(reason) Gọi điều này trong một phương thức kiểm tra hoặc setUp () bỏ qua kiểm tra hiện tại. |
7 | debug() Chạy thử nghiệm mà không thu thập kết quả. |
số 8 | shortDescription() Trả về mô tả một dòng của bài kiểm tra. |
Đồ đạc
Có thể có nhiều bài kiểm tra được viết bên trong một lớp TestCase. Các phương pháp kiểm tra này có thể cần kết nối cơ sở dữ liệu, tệp tạm thời hoặc các tài nguyên khác để được khởi tạo. Chúng được gọi là đồ đạc. TestCase bao gồm một móc đặc biệt để định cấu hình và dọn dẹp bất kỳ đồ đạc nào cần thiết cho các thử nghiệm của bạn. Để định cấu hình đồ đạc, hãy ghi đè setUp (). Để dọn dẹp, hãy ghi đè lên phương thức xé ráchDown ().
Trong ví dụ sau, hai bài kiểm tra được viết bên trong lớp TestCase. Họ kiểm tra kết quả của phép cộng và phép trừ hai giá trị. Phương thức setup () khởi tạo các đối số dựa trên shortDescription () của mỗi bài kiểm tra. Phương thức teardown () sẽ được thực thi vào cuối mỗi lần kiểm tra.
import unittest
class simpleTest2(unittest.TestCase):
def setUp(self):
self.a = 10
self.b = 20
name = self.shortDescription()
if name == "Add":
self.a = 10
self.b = 20
print name, self.a, self.b
if name == "sub":
self.a = 50
self.b = 60
print name, self.a, self.b
def tearDown(self):
print '\nend of test',self.shortDescription()
def testadd(self):
"""Add"""
result = self.a+self.b
self.assertTrue(result == 100)
def testsub(self):
"""sub"""
result = self.a-self.b
self.assertTrue(result == -10)
if __name__ == '__main__':
unittest.main()
Chạy đoạn mã trên từ dòng lệnh. Nó cho kết quả sau:
C:\Python27>python test2.py
Add 10 20
F
end of test Add
sub 50 60
end of test sub
.
================================================================
FAIL: testadd (__main__.simpleTest2)
Add
----------------------------------------------------------------------
Traceback (most recent call last):
File "test2.py", line 21, in testadd
self.assertTrue(result == 100)
AssertionError: False is not true
----------------------------------------------------------------------
Ran 2 tests in 0.015s
FAILED (failures = 1)
Lịch thi đấu lớp
Lớp TestCase có một phương thức setUpClass () có thể được ghi đè để thực thi trước khi thực hiện các bài kiểm tra riêng lẻ bên trong một lớp TestCase. Tương tự, phương thức ráchDownClass () sẽ được thực thi sau tất cả các lần kiểm tra trong lớp. Cả hai phương thức đều là phương thức lớp. Do đó, chúng phải được trang trí bằng chỉ thị @classmethod.
Ví dụ sau minh họa việc sử dụng các phương thức lớp này:
import unittest
class TestFixtures(unittest.TestCase):
@classmethod
def setUpClass(cls):
print 'called once before any tests in class'
@classmethod
def tearDownClass(cls):
print '\ncalled once after all tests in class'
def setUp(self):
self.a = 10
self.b = 20
name = self.shortDescription()
print '\n',name
def tearDown(self):
print '\nend of test',self.shortDescription()
def test1(self):
"""One"""
result = self.a+self.b
self.assertTrue(True)
def test2(self):
"""Two"""
result = self.a-self.b
self.assertTrue(False)
if __name__ == '__main__':
unittest.main()
Lớp TestSuite
Khung thử nghiệm của Python cung cấp một cơ chế hữu ích mà theo đó các trường hợp thử nghiệm có thể được nhóm lại với nhau theo các tính năng mà chúng thử nghiệm. Cơ chế này được tạo sẵn bởi lớp TestSuite trong mô-đun đơn nhất.
Các bước sau đây liên quan đến việc tạo và chạy bộ thử nghiệm.
Step 1 - Tạo một thể hiện của lớp TestSuite.
suite = unittest.TestSuite()
Step 2 - Thêm các bài kiểm tra bên trong một lớp TestCase trong bộ.
suite.addTest(testcase class)
Step 3 - Bạn cũng có thể sử dụng phương thức makeSuite () để thêm các bài kiểm tra từ một lớp
suite = unittest.makeSuite(test case class)
Step 4 - Các bài kiểm tra cá nhân cũng có thể được thêm vào trong bộ.
suite.addTest(testcaseclass(""testmethod")
Step 5 - Tạo một đối tượng của lớp TestTestRunner.
runner = unittest.TextTestRunner()
Step 6 - Gọi phương thức run () để chạy tất cả các bài kiểm tra trong bộ
runner.run (suite)
Các phương thức sau được định nghĩa trong lớp TestSuite:
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | addTest() Thêm một phương pháp thử nghiệm trong bộ thử nghiệm. |
2 | addTests() Thêm các bài kiểm tra từ nhiều lớp TestCase. |
3 | run() Chạy các bài kiểm tra được liên kết với bộ phần mềm này, thu thập kết quả vào đối tượng kết quả kiểm tra |
4 | debug() Chạy các bài kiểm tra được liên kết với bộ phần mềm này mà không thu thập kết quả. |
5 | countTestCases() Trả về số lượng thử nghiệm được đại diện bởi đối tượng thử nghiệm này |
Ví dụ sau đây cho thấy cách sử dụng lớp TestSuite:
import unittest
class suiteTest(unittest.TestCase):
def setUp(self):
self.a = 10
self.b = 20
def testadd(self):
"""Add"""
result = self.a+self.b
self.assertTrue(result == 100)
def testsub(self):
"""sub"""
result = self.a-self.b
self.assertTrue(result == -10)
def suite():
suite = unittest.TestSuite()
## suite.addTest (simpleTest3("testadd"))
## suite.addTest (simpleTest3("testsub"))
suite.addTest(unittest.makeSuite(simpleTest3))
return suite
if __name__ == '__main__':
runner = unittest.TextTestRunner()
test_suite = suite()
runner.run (test_suite)
Bạn có thể thử nghiệm với phương thức addTest () bằng cách bỏ ghi chú các dòng và câu lệnh bình luận có phương thức makeSuite ().
Lớp TestLoader
Gói mới nhất có lớp TestLoader được sử dụng để tạo các bộ thử nghiệm từ các lớp và mô-đun. Theo mặc định, thể hiện unittest.defaultTestLoader được tạo tự động khi phương thức unittest.main (0 được gọi. Tuy nhiên, một thể hiện rõ ràng cho phép tùy chỉnh các thuộc tính nhất định.
Trong đoạn mã sau, các bài kiểm tra từ hai lớp được thu thập trong một Danh sách bằng cách sử dụng đối tượng TestLoader.
import unittest
testList = [Test1, Test2]
testLoad = unittest.TestLoader()
TestList = []
for testCase in testList:
testSuite = testLoad.loadTestsFromTestCase(testCase)
TestList.append(testSuite)
newSuite = unittest.TestSuite(TestList)
runner = unittest.TextTestRunner()
runner.run(newSuite)
Bảng sau đây hiển thị danh sách các phương thức trong lớp TestLoader:
Sr.No | Phương pháp & Mô tả |
---|---|
1 | loadTestsFromTestCase() Trả lại một bộ tất cả các trường hợp kiểm thử có trong một lớp TestCase |
2 | loadTestsFromModule() Trả lại một bộ tất cả các trường hợp kiểm tra có trong mô-đun đã cho. |
3 | loadTestsFromName() Trả về một tập hợp tất cả các trường hợp kiểm tra được cung cấp một trình xác định chuỗi. |
4 | discover() Tìm tất cả các mô-đun thử nghiệm bằng cách đệ quy vào các thư mục con từ thư mục bắt đầu được chỉ định và trả về một đối tượng TestSuite |
Lớp TestResult
Lớp này được sử dụng để biên dịch thông tin về các bài kiểm tra đã thành công và các bài kiểm tra gặp thất bại. Một đối tượng TestResult lưu trữ kết quả của một tập hợp các bài kiểm tra. Một cá thể TestResult được trả về bởi phương thức TestRunner.run ().
Các phiên bản TestResult có các thuộc tính sau:
Sr.No. | Thuộc tính & Mô tả |
---|---|
1 | Errors Danh sách chứa 2 bộ dữ liệu TestCase và các chuỗi chứa các bản ghi theo dõi được định dạng. Mỗi bộ giá trị đại diện cho một bài kiểm tra đưa ra một ngoại lệ không mong muốn. |
2 | Failures Danh sách chứa 2 bộ dữ liệu TestCase và các chuỗi chứa các bản ghi theo dõi được định dạng. Mỗi tuple đại diện cho một bài kiểm tra trong đó lỗi được báo hiệu một cách rõ ràng bằng cách sử dụng các phương thức TestCase.assert * (). |
3 | Skipped Một danh sách chứa 2 bộ dữ liệu và chuỗi TestCase chứa lý do bỏ qua bài kiểm tra. |
4 | wasSuccessful() Trả về True nếu tất cả các thử nghiệm đã chạy cho đến nay đã vượt qua, nếu không trả về False. |
5 | stop() Phương thức này có thể được gọi để báo hiệu rằng tập hợp các thử nghiệm đang được chạy nên được hủy bỏ. |
6 | startTestRun() Được gọi một lần trước khi bất kỳ thử nghiệm nào được thực hiện. |
7 | stopTestRun() Được gọi một lần sau khi tất cả các thử nghiệm được thực hiện. |
số 8 | testsRun Tổng số thử nghiệm đã chạy cho đến nay. |
9 | Buffer Nếu được đặt thành true, sys.stdout và sys.stderrsẽ được đệm vào giữa startTest () và stopTest () đang được gọi. |
Đoạn mã sau thực thi một bộ thử nghiệm -
if __name__ == '__main__':
runner = unittest.TextTestRunner()
test_suite = suite()
result = runner.run (test_suite)
print "---- START OF TEST RESULTS"
print result
print "result::errors"
print result.errors
print "result::failures"
print result.failures
print "result::skipped"
print result.skipped
print "result::successful"
print result.wasSuccessful()
print "result::test-run"
print result.testsRun
print "---- END OF TEST RESULTS"
Đoạn mã khi được thực thi sẽ hiển thị đầu ra sau:
---- START OF TEST RESULTS
<unittest.runner.TextTestResult run = 2 errors = 0 failures = 1>
result::errors
[]
result::failures
[(<__main__.suiteTest testMethod = testadd>, 'Traceback (most recent call last):\n
File "test3.py", line 10, in testadd\n
self.assertTrue(result == 100)\nAssert
ionError: False is not true\n')]
result::skipped
[]
result::successful
False
result::test-run
2
---- END OF TEST RESULTS