2009-11-30 26 views
7

Trong bộ cài đặt python, python setup.py kiểm tra chạy các testsuite. Tuy nhiên nếu tôi có lỗi nhập trong testuite của tôi, thông báo lỗi duy nhất tôi nhận được là một AttributeError phàn nàn rằng lớp thử nghiệm của tôi bị thiếu. Có cách nào để có được một thông báo lỗi chi tiết hơn, vì vậy tôi có thể sửa chữa các testuite?setuptools kiểm tra ẩn lỗi nhập. Làm thế nào để có thông tin tốt hơn?

Tôi sẽ giải thích rõ hơn cho mình bằng ví dụ sau. Giả sử tôi có một gói được gọi là foo, được tạo mới bằng paster. sau đó tôi thêm các thử nghiệm

./foo 
./foo/__init__.py 
./foo/tests 
./foo/tests/__init__.py 
./foo/tests/mytest.py 
./setup.cfg 
./setup.py 

Bây giờ, giả sử mytest.py chứa đoạn mã sau

import unittest 
class MyTestClass(unittest.TestCase): 
    def testFoo(self): 
     self.assertEqual(1,1) 

này hoạt động. Tuy nhiên, nếu tôi cố gắng nhập một module unexistent

import unittest 
import frombiz 
class MyTestClass(unittest.TestCase): 
    def testFoo(self): 
     self.assertEqual(1,1) 

Đây là lỗi tôi có được

Traceback (most recent call last): 
    File "setup.py", line 26, in <module> 
    test_suite = "foo.tests" 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/core.py", line 152, in setup 
    dist.run_commands() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/dist.py", line 975, in run_commands 
    self.run_command(cmd) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/dist.py", line 995, in run_command 
    cmd_obj.run() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/setuptools/command/test.py", line 121, in run 
    self.with_project_on_sys_path(self.run_tests) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/setuptools/command/test.py", line 101, in with_project_on_sys_path 
    func() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/setuptools/command/test.py", line 130, in run_tests 
    testLoader = loader_class() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 816, in __init__ 
    self.parseArgs(argv) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 843, in parseArgs 
    self.createTests() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 849, in createTests 
    self.module) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 613, in loadTestsFromNames 
    suites = [self.loadTestsFromName(name, module) for name in names] 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 587, in loadTestsFromName 
    return self.loadTestsFromModule(obj) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/setuptools/command/test.py", line 34, in loadTestsFromModule 
    tests.append(self.loadTestsFromName(submodule)) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 584, in loadTestsFromName 
    parent, obj = obj, getattr(obj, part) 
AttributeError: 'module' object has no attribute 'mytest' 

Nói cách khác, không có tham chiếu đến việc nhập khẩu thất bại.

+1

tôi đoán là không có cách nào để có được những gì bạn muốn mà không thay đổi mã nguồn setuptool của. – codeape

+0

@codeape - và chúc may mắn với điều đó.:-) –

Trả lời

1

Vấn đề là đối số đầu tiên của __import__() phải là mô-đun. Khi bạn cần phải tiếp cận một số đối tượng với tên chấm chấm bạn không bao giờ biết phần nào là mô-đun và cái gì không. Một cách để có được đối tượng module.subname là thử nhập nó dưới dạng mô-đun con đầu tiên và khi nó không sử dụng getattr(module, subname), như unittest. Điều này đôi khi sẽ cung cấp cho bạn AttributeError thay vì ImportError. Một cách khác để làm điều này là thử getattr(module, subname) trước và chỉ khi nó không thử nhập. Cách này không tốt hơn: đôi khi nó sẽ cung cấp cho bạn ImportError khi thích hợp hơn sẽ là AttributeError.

Có thể là tốt nhất unittest có thể thực hiện trong trường hợp này là tăng ngoại lệ của riêng nó cho biết rằng cả tra cứu nhập và thuộc tính đều không thành công. Cố gắng gửi báo cáo lỗi cho vấn đề này.

+1

Báo cáo lỗi đã được đăng nhập chưa? –

0

Bạn cũng có thể muốn thử mã của mình với Distribute (một nhánh của các công cụ thiết lập vì các công cụ thiết lập không được duy trì chủ động). Tôi không biết nếu nó sẽ làm bất cứ điều gì khác nhau, nhưng nó có giá trị một shot.

+0

phân phối 0.6.24 có cùng vấn đề. –

0

Vấn đề ở đây là một Python ImportError không cho bạn biết những gì mô-đun lỗi thực sự xảy ra, trừ khi bạn cẩn thận kiểm tra traceback - mô-đun unittest không làm. Bạn sẽ có cùng một vấn đề với mô-đun unittest, bất kể bạn sử dụng công cụ nào để chạy nó.

Bạn có thể thử gói "mũi" - plugin có plugin setuptools, vì vậy bạn có thể thêm nó vào setup.py và cho phép tìm và nhập các thử nghiệm của bạn thay vì sử dụng công cụ tìm kiểm tra mặc định của công cụ cài đặt. Nếu tôi nhớ chính xác, nó tải mã kiểm tra theo cách khác với cách không thực hiện và có thể cung cấp thông báo lỗi tốt hơn trong trường hợp này. Và ngay cả khi nó không, nó có lẽ sẽ dễ dàng hơn để làm cho nó được thêm vào mũi hơn là unittest!

3

Sử dụng nose. Không cần sửa đổi mã của bạn. Chỉ cần làm:

$ pip install nose 
$ nosetests 

Nếu có một ImportError, bạn sẽ thấy nó:

ERROR: Failure: ImportError (cannot import name MyModel) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/garyvdm/bwreport/ve/lib/python3.2/site-packages/nose/failure.py", line 37, in runTest 
    raise self.exc_class(self.exc_val).with_traceback(self.tb) 
    File "/home/garyvdm/bwreport/ve/lib/python3.2/site-packages/nose/loader.py", line 390, in loadTestsFromName 
    addr.filename, addr.module) 
    File "/home/garyvdm/bwreport/ve/lib/python3.2/site-packages/nose/importer.py", line 39, in importFromPath 
    return self.importFromDir(dir_path, fqname) 
    File "/home/garyvdm/bwreport/ve/lib/python3.2/site-packages/nose/importer.py", line 86, in importFromDir 
    mod = load_module(part_fqname, fh, filename, desc) 
    File "/home/garyvdm/bwreport/bwreport/daemon/__init__.py", line 11, in <module> 
    from bwreport.models import (
ImportError: cannot import name MyModel 
+0

Phiên bản Python3 của mũi đã cho tôi lỗi rõ ràng về các vấn đề nhập thay vì AttributeError mơ hồ như trong câu hỏi ban đầu. Tốt đẹp! – mlt

+1

Nó phải là 'nosetests' – dvim

+0

@Martynas đã chỉnh sửa – Aliostad

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