Làm cách nào để chạy tất cả các bài kiểm tra đơn vị Python trong một thư mục?


315

Tôi có một thư mục chứa các bài kiểm tra đơn vị Python của tôi. Mỗi mô-đun kiểm tra đơn vị có dạng thử nghiệm _ *. Py . Tôi đang cố gắng tạo một tệp có tên all_test.py , bạn sẽ đoán nó, chạy tất cả các tệp trong mẫu thử nghiệm đã nói ở trên và trả về kết quả. Tôi đã thử hai phương pháp cho đến nay; Cả hai đều thất bại. Tôi sẽ chỉ ra hai phương pháp và tôi hy vọng ai đó ngoài kia biết cách thực sự làm điều này một cách chính xác.

Đối với nỗ lực dũng cảm đầu tiên của tôi, tôi nghĩ rằng "Nếu tôi chỉ nhập tất cả các mô-đun thử nghiệm của mình vào tệp, sau đó gọi hình tượng trưng này unittest.main(), nó sẽ hoạt động, phải không?" Chà, hóa ra tôi đã sai.

import glob
import unittest

testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]

if __name__ == "__main__":
     unittest.main()

Điều này đã không làm việc, kết quả tôi nhận được là:

$ python all_test.py 

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

Đối với lần thử thứ hai, tôi nghĩ, ok, có lẽ tôi sẽ cố gắng thực hiện toàn bộ việc thử nghiệm này theo cách "thủ công" hơn. Vì vậy, tôi đã cố gắng làm điều đó dưới đây:

import glob
import unittest

testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
[__import__(str) for str in module_strings]
suites = [unittest.TestLoader().loadTestsFromName(str) for str in module_strings]
[testSuite.addTest(suite) for suite in suites]
print testSuite 

result = unittest.TestResult()
testSuite.run(result)
print result

#Ok, at this point I have a result
#How do I display it as the normal unit test command line output?
if __name__ == "__main__":
    unittest.main()

Điều này cũng không hoạt động, nhưng nó có vẻ rất gần!

$ python all_test.py 
<unittest.TestSuite tests=[<unittest.TestSuite tests=[<unittest.TestSuite tests=[<test_main.TestMain testMethod=test_respondes_to_get>]>]>]>
<unittest.TestResult run=1 errors=0 failures=0>

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

Tôi dường như có một bộ phần nào đó, và tôi có thể thực hiện kết quả. Tôi có một chút lo ngại về thực tế rằng nó nói rằng tôi chỉ có run=1, có vẻ như điều đó nên run=2, nhưng đó là sự tiến bộ. Nhưng làm thế nào để tôi vượt qua và hiển thị kết quả thành chính? Hoặc về cơ bản làm thế nào để nó hoạt động để tôi có thể chạy tệp này và khi làm như vậy, hãy chạy tất cả các bài kiểm tra đơn vị trong thư mục này?


1
Bỏ qua câu trả lời của Travis nếu bạn đang sử dụng Python 2.7+
Rocky

Bạn đã bao giờ thử chạy thử nghiệm từ một đối tượng thử nghiệm chưa?
Pinocchio

Xem câu trả lời này cho một giải pháp với cấu trúc tệp ví dụ.
Derek Soike

Câu trả lời:


477

Với Python 2.7 trở lên, bạn không phải viết mã mới hoặc sử dụng các công cụ của bên thứ ba để làm điều này; thực hiện kiểm tra đệ quy thông qua dòng lệnh được tích hợp. Đặt một __init__.pytrong thư mục thử nghiệm của bạn và:

python -m unittest discover <test_directory>
# or
python -m unittest discover -s <directory> -p '*_test.py'

Bạn có thể đọc thêm trong tài liệu python 2.7 hoặc python 3.x unittest.


11
các vấn đề bao gồm: ImportError: Thư mục bắt đầu không thể nhập được:
zinking

6
Ít nhất với Python 2.7.8 trên Linux, việc gọi dòng lệnh không mang lại cho tôi đệ quy. Dự án của tôi có một số tiểu dự án có đơn vị kiểm tra trực tiếp trong các thư mục "unit_tests / <subproject> / python /" tương ứng. Nếu tôi chỉ định một đường dẫn như vậy, các kiểm tra đơn vị cho tiểu dự án đó sẽ được chạy, nhưng chỉ với "unit_tests" là đối số thư mục kiểm tra thì không có kiểm tra nào được tìm thấy (thay vì tất cả các kiểm tra cho tất cả các tiểu dự án, như tôi hy vọng). Có gợi ý nào không?
dùng686249

6
Giới thiệu về đệ quy: Lệnh đầu tiên không có <test_directory> mặc định là "." và đệ quy đến mô đun con . Đó là, tất cả các thư mục kiểm tra mà bạn muốn khám phá cần phải có init .py. Nếu họ làm như vậy, họ sẽ được tìm thấy bởi lệnh Discover. Chỉ cần thử nó, nó đã làm việc.
Emil Stenström

Điều này làm việc cho tôi. Tôi có một thư mục thử nghiệm với bốn tệp, chạy tệp này từ thiết bị đầu cuối Linux của tôi, thứ tuyệt vời.
JasTonAChair

5
Cảm ơn! Tại sao đây không phải là câu trả lời được chấp nhận? Theo quan điểm của tôi, câu trả lời tốt hơn luôn là câu trả lời không yêu cầu bất kỳ sự phụ thuộc bên ngoài nào ...
Jonathan Benn

108

Bạn có thể sử dụng một người chạy thử nghiệm sẽ làm điều này cho bạn. mũi rất tốt chẳng hạn. Khi chạy, nó sẽ tìm các bài kiểm tra trong cây hiện tại và chạy chúng.

Cập nhật:

Đây là một số mã từ những ngày trước mũi của tôi. Bạn có thể không muốn danh sách tên mô-đun rõ ràng, nhưng có lẽ phần còn lại sẽ hữu ích cho bạn.

testmodules = [
    'cogapp.test_makefiles',
    'cogapp.test_whiteutils',
    'cogapp.test_cogapp',
    ]

suite = unittest.TestSuite()

for t in testmodules:
    try:
        # If the module defines a suite() function, call it to get the suite.
        mod = __import__(t, globals(), locals(), ['suite'])
        suitefn = getattr(mod, 'suite')
        suite.addTest(suitefn())
    except (ImportError, AttributeError):
        # else, just load all the test cases from the module.
        suite.addTest(unittest.defaultTestLoader.loadTestsFromName(t))

unittest.TextTestRunner().run(suite)

2
Có phải ưu điểm của phương pháp này là chỉ nhập một cách rõ ràng tất cả các mô-đun thử nghiệm của bạn vào một mô-đun test_all.py và gọi unittest.main () mà bạn có thể tùy ý khai báo một bộ thử nghiệm trong một số mô-đun chứ không phải trong các mô-đun khác?
Corey Porter

1
Tôi đã thử mũi và nó hoạt động hoàn hảo. Thật dễ dàng để cài đặt và chạy trong dự án của tôi. Tôi thậm chí đã có thể tự động hóa nó với một vài dòng script, chạy bên trong virtualenv. +1 cho mũi!
Jesse Webb

Không phải lúc nào cũng có thể thực hiện được: đôi khi cấu trúc nhập của dự án có thể dẫn đến việc mũi bị lẫn lộn nếu nó cố gắng chạy nhập trên các mô-đun.
chiffa

4
Lưu ý rằng mũi đã "ở chế độ bảo trì trong nhiều năm qua" và hiện tại chúng tôi khuyên bạn nên sử dụng mũi2 , pytest hoặc chỉ đơn giản là unittest / unittest2 cho các dự án mới.
Kurt Peek

Bạn đã bao giờ thử chạy thử nghiệm từ một đối tượng thử nghiệm chưa?
Pinocchio

96

Trong python 3, nếu bạn đang sử dụng unittest.TestCase:

  • Bạn phải có một __init__.pytệp trống (hoặc nếu không) trong testthư mục của bạn ( phải được đặt tên test/)
  • Các tập tin kiểm tra của bạn bên trong test/phù hợp với mô hình test_*.py. Chúng có thể nằm trong thư mục con bên dưới test/và những thư mục con đó có thể được đặt tên là bất cứ thứ gì.

Sau đó, bạn có thể chạy tất cả các bài kiểm tra với:

python -m unittest

Làm xong! Một giải pháp ít hơn 100 dòng. Hy vọng rằng một người mới bắt đầu trăn tiết kiệm thời gian bằng cách tìm thấy điều này.


3
Lưu ý rằng theo mặc định, nó chỉ tìm kiếm các thử nghiệm trong tên tệp bắt đầu bằng "thử nghiệm"
Shawabawa

3
Điều đó đúng, câu hỏi ban đầu đề cập đến thực tế là "Mỗi mô-đun kiểm tra đơn vị là dạng thử nghiệm _ *. Py.", Vì vậy câu trả lời này được trả lời trực tiếp. Bây giờ tôi đã cập nhật câu trả lời rõ ràng hơn
mã tmck

1
Cảm ơn, đó là điều còn thiếu đối với tôi khi sử dụng câu trả lời của Travis Bear.
Jeremy Cochoy

65

Điều này hiện có thể trực tiếp từ unittest: unittest.TestLoader.discover .

import unittest
loader = unittest.TestLoader()
start_dir = 'path/to/your/test/files'
suite = loader.discover(start_dir)

runner = unittest.TextTestRunner()
runner.run(suite)

3
Tôi cũng đã thử phương pháp này, có vài thử nghiệm, nhưng hoạt động hoàn hảo. Thông minh!!! Nhưng tôi tò mò tôi chỉ có 4 bài kiểm tra. Họ cùng nhau chạy 0,032s, nhưng khi tôi sử dụng phương pháp này để chạy tất cả, tôi nhận được kết quả .... ---------------------------------------------------------------------- Ran 4 tests in 0.000s OKTại sao? Sự khác biệt, nó đến từ đâu?
simkus

Tôi gặp sự cố khi chạy một tệp trông như thế này từ dòng lệnh. Làm thế nào nó nên được gọi?
Dustin Michels

python file.py
tàn

1
Làm việc hoàn hảo! Chỉ cần đặt nó trong test / dir của bạn và sau đó đặt start_id = "./". IMHO, câu trả lời này bây giờ (Python 3.7) là cách được chấp nhận!
jjwdesign

Bạn có thể thay đổi dòng cuối cùng thành ônresres = runner.run (bộ); sys.exit (0 if res.wasSuccessful () other 1) ọ nếu bạn muốn có một mã thoát chính xác
Sadap

32

Vâng, bằng cách nghiên cứu mã ở trên một chút (cụ thể là sử dụng TextTestRunnerdefaultTestLoader), tôi đã có thể đến gần. Cuối cùng, tôi đã sửa mã của mình bằng cách chuyển tất cả các bộ kiểm thử sang một hàm tạo bộ đơn, thay vì thêm chúng "thủ công", điều này đã khắc phục các vấn đề khác của tôi. Vì vậy, đây là giải pháp của tôi.

import glob
import unittest

test_files = glob.glob('test_*.py')
module_strings = [test_file[0:len(test_file)-3] for test_file in test_files]
suites = [unittest.defaultTestLoader.loadTestsFromName(test_file) for test_file in module_strings]
test_suite = unittest.TestSuite(suites)
test_runner = unittest.TextTestRunner().run(test_suite)

Vâng, có lẽ chỉ dễ sử dụng mũi hơn là làm điều này, nhưng đó là vấn đề quan trọng.


tốt, nó hoạt động tốt cho thư mục hiện tại, làm thế nào để gọi trực tiếp phụ?
Larry Cai

Larry, xem câu trả lời mới ( stackoverflow.com/a/24562019/104143 ) để khám phá thử nghiệm đệ quy
Peter Kofler

Bạn đã bao giờ thử chạy thử nghiệm từ một đối tượng thử nghiệm chưa?
Pinocchio

25

Nếu bạn muốn chạy tất cả các bài kiểm tra từ các lớp trường hợp kiểm thử khác nhau và bạn vui lòng chỉ định chúng một cách rõ ràng thì bạn có thể làm như thế này:

from unittest import TestLoader, TextTestRunner, TestSuite
from uclid.test.test_symbols import TestSymbols
from uclid.test.test_patterns import TestPatterns

if __name__ == "__main__":

    loader = TestLoader()
    tests = [
        loader.loadTestsFromTestCase(test)
        for test in (TestSymbols, TestPatterns)
    ]
    suite = TestSuite(tests)

    runner = TextTestRunner(verbosity=2)
    runner.run(suite)

nơi uclidlà dự án của tôi và TestSymbolsTestPatternslà lớp con của TestCase.


Từ các tài liệu unittest.TestLoader : "Thông thường, không cần tạo một thể hiện của lớp này; mô-đun unittest cung cấp một thể hiện có thể được chia sẻ dưới dạng unittest.defaultTestLoader." Ngoài ra, vì TestSuitechấp nhận một iterable làm đối số, bạn có thể xây dựng iterable đã nói trong một vòng lặp để tránh lặp lại loader.loadTestsFromTestCase.
Nhà giả kim hai bit

@ Nhà giả kim hai bit nói riêng điểm thứ hai của bạn là tốt. Tôi sẽ thay đổi mã để bao gồm nhưng tôi không thể kiểm tra nó. (Bản mod đầu tiên sẽ làm cho nó trông giống như Java theo ý thích của tôi .. mặc dù tôi nhận ra tôi là người không hợp lý (vặn cho họ một tên biến trường hợp lạc đà của họ)).
con nhím mất trí

Đây là fav của tôi, rất sạch sẽ. Đã có thể đóng gói cái này và biến nó thành một đối số trong dòng lệnh thông thường của tôi.
MarkII

15

Tôi đã sử dụng discoverphương thức và quá tải load_testsđể đạt được kết quả này trong một dòng mã số (tối thiểu, tôi nghĩ):

def load_tests(loader, tests, pattern):
''' Discover and load all unit tests in all files named ``*_test.py`` in ``./src/``
'''
    suite = TestSuite()
    for all_test_suite in unittest.defaultTestLoader.discover('src', pattern='*_tests.py'):
        for test_suite in all_test_suite:
            suite.addTests(test_suite)
    return suite

if __name__ == '__main__':
    unittest.main()

Thực hiện trên fives một cái gì đó như

Ran 27 tests in 0.187s
OK

cái này chỉ có sẵn cho python2.7, tôi đoán
Larry Cai

@larrycai Có lẽ, tôi thường dùng Python 3, đôi khi là Python 2.7. Câu hỏi không được gắn với một phiên bản cụ thể.
rds

Tôi đang dùng Python 3.4 và khám phá trả về một bộ, làm cho vòng lặp trở nên dư thừa.
Cồn cát

Đối với tương lai của Larry: "Nhiều tính năng mới đã được thêm vào không đáng tin cậy trong Python 2.7, bao gồm cả khám phá thử nghiệm. Unittest2 cho phép bạn sử dụng các tính năng này với các phiên bản Python trước đó."
Nhà giả kim hai bit

8

Tôi đã thử nhiều cách tiếp cận khác nhau nhưng tất cả đều có vẻ thiếu sót hoặc tôi phải trang điểm một số mã, điều đó thật khó chịu. Nhưng có một cách thuận tiện trong linux, đó đơn giản là tìm mọi thử nghiệm thông qua mẫu nhất định và sau đó gọi từng cái một.

find . -name 'Test*py' -exec python '{}' \;

và quan trọng nhất, nó chắc chắn hoạt động.


7

Trong trường hợp thư viện đóng gói hoặc ứng dụng, bạn không muốn làm điều đó. setuptools sẽ làm điều đó cho bạn .

Để sử dụng lệnh này, các kiểm tra của dự án của bạn phải được gói trong một unittestbộ kiểm thử bởi một hàm, một lớp hoặc phương thức TestCase hoặc một mô-đun hoặc gói chứa TestCasecác lớp. Nếu bộ được đặt tên là một mô-đun và mô-đun có additional_tests()chức năng, nó được gọi và kết quả (phải là a unittest.TestSuite) được thêm vào các thử nghiệm sẽ được chạy. Nếu bộ được đặt tên là một gói, bất kỳ mô hình con và gói con nào sẽ được thêm đệ quy vào bộ thử nghiệm tổng thể .

Chỉ cần cho nó biết gói kiểm tra gốc của bạn ở đâu, như:

setup(
    # ...
    test_suite = 'somepkg.test'
)

Và chạy python setup.py test.

Phát hiện dựa trên tệp có thể có vấn đề trong Python 3, trừ khi bạn tránh nhập tương đối trong bộ kiểm tra của mình, vì discoversử dụng nhập tệp. Mặc dù nó hỗ trợ tùy chọn top_level_dir, nhưng tôi có một số lỗi đệ quy vô hạn. Vì vậy, một giải pháp đơn giản cho mã không được đóng gói là đưa phần sau vào __init__.pygói thử nghiệm của bạn (xem Giao thức load_tests ).

import unittest

from . import foo, bar


def load_tests(loader, tests, pattern):
    suite = unittest.TestSuite()
    suite.addTests(loader.loadTestsFromModule(foo))
    suite.addTests(loader.loadTestsFromModule(bar))

    return suite

Câu trả lời hay, và nó có thể được sử dụng để tự động hóa kiểm tra trước khi triển khai! Cảm ơn
Arthur Clerc-Gherardi

4

Tôi sử dụng PyDev / LiClipse và chưa thực sự tìm ra cách chạy tất cả các thử nghiệm cùng một lúc từ GUI. (chỉnh sửa: bạn nhấp chuột phải vào thư mục kiểm tra gốc và chọnRun as -> Python unit-test

Đây là cách giải quyết hiện tại của tôi:

import unittest

def load_tests(loader, tests, pattern):
    return loader.discover('.')

if __name__ == '__main__':
    unittest.main()

Tôi đặt mã này trong một mô-đun được gọi alltrong thư mục thử nghiệm của tôi. Nếu tôi chạy mô-đun này dưới dạng ít nhất từ ​​LiClipse thì tất cả các thử nghiệm đều được chạy. Nếu tôi yêu cầu chỉ lặp lại các thử nghiệm cụ thể hoặc thất bại thì chỉ những thử nghiệm đó mới được chạy. Nó cũng không can thiệp vào người chạy thử nghiệm dòng lệnh của tôi (nosetests) - nó bị bỏ qua.

Bạn có thể cần thay đổi các đối số discoverdựa trên thiết lập dự án của bạn.


Tên của tất cả các tệp thử nghiệm và phương thức thử nghiệm phải bắt đầu bằng "test_". Nếu không, lệnh "Chạy dưới dạng -> Kiểm tra đơn vị Python" sẽ không tìm thấy chúng.
Stefan

2

Dựa trên câu trả lời của Stephen Cagle, tôi đã thêm hỗ trợ cho các mô-đun thử nghiệm lồng nhau.

import fnmatch
import os
import unittest

def all_test_modules(root_dir, pattern):
    test_file_names = all_files_in(root_dir, pattern)
    return [path_to_module(str) for str in test_file_names]

def all_files_in(root_dir, pattern):
    matches = []

    for root, dirnames, filenames in os.walk(root_dir):
        for filename in fnmatch.filter(filenames, pattern):
            matches.append(os.path.join(root, filename))

    return matches

def path_to_module(py_file):
    return strip_leading_dots( \
        replace_slash_by_dot(  \
            strip_extension(py_file)))

def strip_extension(py_file):
    return py_file[0:len(py_file) - len('.py')]

def replace_slash_by_dot(str):
    return str.replace('\\', '.').replace('/', '.')

def strip_leading_dots(str):
    while str.startswith('.'):
       str = str[1:len(str)]
    return str

module_names = all_test_modules('.', '*Tests.py')
suites = [unittest.defaultTestLoader.loadTestsFromName(mname) for mname 
    in module_names]

testSuite = unittest.TestSuite(suites)
runner = unittest.TextTestRunner(verbosity=1)
runner.run(testSuite)

Mã này tìm kiếm tất cả các thư mục con của .cho *Tests.pyfile sau đó được nạp. Nó hy vọng mỗi lớp *Tests.pysẽ chứa một lớp duy nhất *Tests(unittest.TestCase)được tải lần lượt và thực hiện lần lượt từng lớp .

Điều này hoạt động với việc lồng sâu các thư mục / mô-đun, nhưng mỗi thư mục ở giữa cần phải chứa một __init__.pytệp trống ít nhất. Điều này cho phép thử nghiệm tải các mô-đun lồng nhau bằng cách thay thế dấu gạch chéo (hoặc dấu gạch chéo ngược) bằng dấu chấm (xem replace_slash_by_dot).


2

Đây là một câu hỏi cũ, nhưng điều làm việc cho tôi bây giờ (năm 2019) là:

python -m unittest *_test.py

Tất cả các tệp thử nghiệm của tôi nằm trong cùng thư mục với các tệp nguồn và chúng kết thúc bằng _test.



1

Kịch bản BASH này sẽ thực thi thư mục kiểm tra không đáng tin nhất python từ BẤT CỨ NƠI NÀO trong hệ thống tệp, bất kể bạn đang ở thư mục làm việc nào: thư mục làm việc của nó luôn testở vị trí thư mục đó .

TẤT CẢ CÁC KIỂM TRA, độc lập $ PWD

mô-đun Python không nhạy cảm với thư mục hiện tại của bạn, trừ khi bạn cho nó biết ở đâu (sử dụng discover -stùy chọn).

Điều này hữu ích khi ở trong thư mục ./srchoặc ./examplelàm việc và bạn cần kiểm tra đơn vị tổng thể nhanh chóng:

#!/bin/bash
this_program="$0"
dirname="`dirname $this_program`"
readlink="`readlink -e $dirname`"

python -m unittest discover -s "$readlink"/test -v

KIỂM TRA CHỌN, độc lập $ PWD

Tôi đặt tên cho tệp tiện ích này: runone.pyvà sử dụng nó như thế này:

runone.py <test-python-filename-minus-dot-py-fileextension>
#!/bin/bash
this_program="$0"
dirname="`dirname $this_program`"
readlink="`readlink -e $dirname`"

(cd "$dirname"/test; python -m unittest $1)

Không cần một test/__init__.pytập tin để gánh nặng gói / bộ nhớ của bạn trong quá trình sản xuất.


-3

Đây là cách tiếp cận của tôi bằng cách tạo một trình bao bọc để chạy thử nghiệm từ dòng lệnh:

#!/usr/bin/env python3
import os, sys, unittest, argparse, inspect, logging

if __name__ == '__main__':
    # Parse arguments.
    parser = argparse.ArgumentParser(add_help=False)
    parser.add_argument("-?", "--help",     action="help",                        help="show this help message and exit" )
    parser.add_argument("-v", "--verbose",  action="store_true", dest="verbose",  help="increase output verbosity" )
    parser.add_argument("-d", "--debug",    action="store_true", dest="debug",    help="show debug messages" )
    parser.add_argument("-h", "--host",     action="store",      dest="host",     help="Destination host" )
    parser.add_argument("-b", "--browser",  action="store",      dest="browser",  help="Browser driver.", choices=["Firefox", "Chrome", "IE", "Opera", "PhantomJS"] )
    parser.add_argument("-r", "--reports-dir", action="store",   dest="dir",      help="Directory to save screenshots.", default="reports")
    parser.add_argument('files', nargs='*')
    args = parser.parse_args()

    # Load files from the arguments.
    for filename in args.files:
        exec(open(filename).read())

    # See: http://codereview.stackexchange.com/q/88655/15346
    def make_suite(tc_class):
        testloader = unittest.TestLoader()
        testnames = testloader.getTestCaseNames(tc_class)
        suite = unittest.TestSuite()
        for name in testnames:
            suite.addTest(tc_class(name, cargs=args))
        return suite

    # Add all tests.
    alltests = unittest.TestSuite()
    for name, obj in inspect.getmembers(sys.modules[__name__]):
        if inspect.isclass(obj) and name.startswith("FooTest"):
            alltests.addTest(make_suite(obj))

    # Set-up logger
    verbose = bool(os.environ.get('VERBOSE', args.verbose))
    debug   = bool(os.environ.get('DEBUG', args.debug))
    if verbose or debug:
        logging.basicConfig( stream=sys.stdout )
        root = logging.getLogger()
        root.setLevel(logging.INFO if verbose else logging.DEBUG)
        ch = logging.StreamHandler(sys.stdout)
        ch.setLevel(logging.INFO if verbose else logging.DEBUG)
        ch.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(name)s: %(message)s'))
        root.addHandler(ch)
    else:
        logging.basicConfig(stream=sys.stderr)

    # Run tests.
    result = unittest.TextTestRunner(verbosity=2).run(alltests)
    sys.exit(not result.wasSuccessful())

Để đơn giản, xin vui lòng loại trừ các tiêu chuẩn mã hóa không PEP8 của tôi .

Sau đó, bạn có thể tạo lớp BaseTest cho các thành phần phổ biến cho tất cả các thử nghiệm của mình, vì vậy mỗi thử nghiệm của bạn sẽ trông giống như:

from BaseTest import BaseTest
class FooTestPagesBasic(BaseTest):
    def test_foo(self):
        driver = self.driver
        driver.get(self.base_url + "/")

Để chạy, bạn chỉ cần chỉ định các kiểm tra như một phần của các đối số dòng lệnh, ví dụ:

./run_tests.py -h http://example.com/ tests/**/*.py

2
hầu hết câu trả lời này không liên quan gì đến khám phá thử nghiệm (ví dụ đăng nhập, v.v.). Stack Overflow là để trả lời các câu hỏi, không hiển thị mã không liên quan.
Corey Goldberg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.