2009-12-03 39 views
25

Tôi có một tập lệnh đóng vai trò như một trình bao bọc cho một số bài kiểm tra đơn vị được viết bằng mô-đun Python unittest. Ngoài dọn dẹp một số tác phẩm, tạo ra một output stream và tạo ra một số mã, nó tải trường hợp thử nghiệm vào một bộ sử dụngPython, kiểm tra đơn vị - Vượt qua các đối số dòng lệnh để thiết lập unittest.TestCase

unittest.TestLoader().loadTestsFromTestCase() 

Tôi đã sử dụng optparse để kéo ra vài đối số dòng lệnh sử dụng để xác định đầu ra vị trí, cho dù để tái tạo mã và cho dù để làm một số làm sạch. Tôi cũng muốn chuyển một biến cấu hình, cụ thể là một URI điểm cuối, để sử dụng trong các trường hợp thử nghiệm.

Tôi nhận thấy mình có thể thêm OptionParser vào phương pháp thiết lập của TestCase, nhưng thay vào đó tôi muốn chuyển tùy chọn sang setUp. Điều này có thể sử dụng loadTestsFromTestCase() không? Tôi có thể lặp qua số TestCases trả lại của TestSuite, nhưng tôi có thể gọi thiết lập theo cách thủ công trên TestCases không?

** EDIT ** tôi muốn chỉ ra rằng tôi có thể vượt qua các đối số setUp nếu tôi lặp qua các bài kiểm tra và gọi setUp bằng tay như:

(options, args) = op.parse_args() 
suite = unittest.TestLoader().loadTestsFromTestCase(MyTests.TestSOAPFunctions) 
for test in suite: 
    test.setUp(options.soap_uri) 

Tuy nhiên, tôi đang sử dụng xmlrunner cho điều này và phương thức chạy của nó lấy một đối số là TestSuite. Tôi cho rằng nó sẽ chạy chính phương thức setUp, vì vậy tôi sẽ cần các tham số có sẵn trong XMLTestRunner.

Tôi hy vọng điều này có ý nghĩa.

Trả lời

43

Vâng, tôi muốn làm điều tương tự và sẽ tự mình đặt câu hỏi này. Tôi muốn cải thiện các mã sau đây vì nó đã sao chép. Nó cho tôi gửi trong lập luận để kiểm tra TestCase tuy nhiên:

import unittest 
import helpspot 

class TestHelpSpot(unittest.TestCase): 
    "A few simple tests for HelpSpot" 

    def __init__(self, testname, path, user, pword): 
     super(TestHelpSpot, self).__init__(testname) 
     self.hs = helpspot.HelpSpot(path, user, pword) 

    def test_version(self): 
     a = self.hs.version() 
     b = self.hs.private_version() 
     self.assertEqual(a, b) 

    def test_get_with_param(self): 
     a = self.hs.filter_get(xFilter=1) 

    def test_unknown_method(self): 
     self.assertRaises(helpspot.HelpSpotError, self.hs.private_wuggienorple) 

if __name__ == '__main__': 
    import sys 
    user = sys.argv[1] 
    pword = sys.argv[2] 
    path = sys.argv[3] 

    test_loader = unittest.TestLoader() 
    test_names = test_loader.getTestCaseNames(TestHelpSpot) 

    suite = unittest.TestSuite() 
    for test_name in test_names: 
     suite.addTest(TestHelpSpot(test_name, path, user, pword)) 

    result = unittest.TextTestRunner().run(suite) 
    sys.exit(not result.wasSuccessful()) 
+0

Helpspot ở đây là gì? – SIslam

+0

HelpSpot là một ứng dụng dịch vụ khách hàng từ UserScape. Tôi đã viết một giao diện Python cho API của nó - https://github.com/JohnSpeno/python-helpspot – jps

+0

Để làm việc này tương tự như 'unittest.main()', bạn nên thêm 'sys.exit (không phải result.wasSuccessful()) 'đến cùng. – abergmeier

5

Tôi chắc chắn sẽ khuyên bạn không nên vượt qua các đối số để thiết lập như thế này; setUp được thiết kế để được gọi ngầm khi chạy thử nghiệm, vì vậy bạn không nên gọi nó như thế này. Một cách bạn có thể giải quyết vấn đề này là đặt các giá trị bạn cần đặt làm biến môi trường hoặc giá trị trong mô-đun "ngữ cảnh" có thể truy cập toàn cầu, cho phép các trường hợp thử nghiệm truy cập chúng khi cần thiết. Tôi sẽ đi cho việc sử dụng các biến môi trường, vì nó linh hoạt hơn trong việc chạy thử nghiệm (bạn sẽ không còn dựa vào các đối số dòng lệnh) nữa.

+4

Và sau đó một số mã khác dựa trên biến môi trường có cùng tên, tuyệt vời. – GNUnit

0

Nếu bạn xác định các thuộc tính trong phương pháp init, sau đó bạn có thể chỉ đơn giản là vượt qua tất cả chúng trong các nhà xây dựng như thế này ..

import unittest 
import helpspot 

class TestHelpSpot(unittest.TestCase): 
    "A few simple tests for HelpSpot" 

    def __init__(self, testname, path, user, pword): 
     super(TestHelpSpot, self).__init__(testname) 
     self.path = path 
     self.user = user 
     self.pword = pword 
.... 
.... 
.... 


if __name__ == '__main__': 
    True 

    suite = unittest.TestSuite() 
    suite.addTest(TestHelpSpot("test_version", path, user, pword))  

    unittest.TextTestRunner().run(suite) 
7
if __name__ == '__main__': 
    from optparse import OptionParser 
    parser = OptionParser() 
    parser.add_option("-z", "--zebra", 
         action="store_true", dest="zebra", default=False, 
         help="run like a zebra")  


    (options, args) = parser.parse_args() 

    if options.zebra: 
     zebrafy() 


    # remove our args because we don't want to send them to unittest 
    for x in sum([h._long_opts+h._short_opts for h in parser.option_list],[]): 
     if x in sys.argv: 
      sys.argv.remove(x) 


    unittest.main() 
+0

Rất đẹp. Chính xác những gì tôi đang tìm kiếm. –

+1

II muốn thêm tùy chọn '-i' và sử dụng mã ở trên ... Tôi bắt đầu thử nghiệm của mình thông qua' .. \ .. \ python \ python -m unittest -v "test_activation.test_activation" -i "input_file" ' . Tại sao điều này cho tôi một lỗi 'test_activation.py: error: không có tùy chọn như vậy: -m'? – Danijel

+0

Điều này không hiệu quả đối với tôi.Tuy nhiên dòng sau để loại bỏ args làm việc. del sys.argv [1:] – Indrajeet

Các vấn đề liên quan