python - Separate test cases per input files? -
most test frameworks assume "1 test = 1 python method/function", , consider test passed when function executes without raising assertions.
i'm testing compiler-like program (a program reads *.foo
files , process contents), want execute same test on many input (*.foo
) files. iow, test looks like:
class test(unittest.testcase): def one_file(self, filename): # actual test def list_testcases(self): # os.listdir('tests/') , filter *.foo files. def test_all(self): f in self.list_testcases(): one_file(f)
my current code uses unittest python's standard library, i.e. one_file
uses self.assert...(...)
statements check whether test passes.
this works, in sense program succeeds/fails when code ok/buggy, i'm loosing lot of advantages of testing framework:
i don't relevant reporting "x failures out of y tests" nor list of passed/failed tests. (i'm planning use such system not test own development grade student's code teacher, reporting important me)
i don't test independence. second test runs on environment left first, , on. first failure stops testsuite: testcases coming after failure not ran @ all.
i feeling i'm abusing test framework: there's 1 test function automatic test discovery of unittest sounds overkill example. same code (should?) written in plain python basic
assert
.
an obvious alternative change code like
class test(unittest.testcase): def one_file(self, filename): # actual test def test_file1(self): one_file("first-testcase.foo") def test_file2(self): one_file("second-testcase.foo")
then advantages of unittest back, but:
it's lot more code write.
it's easy "forget" testcase, i.e. create test file in
tests/
, forget add python test.
i can imagine solution generate 1 method per testcase dynamically (along lines of setattr(self, 'test_file' + str(n), ...)
), generate code second solution without having write hand. sounds overkill use-case doesn't seem complex.
how best of both, i.e. automatic testcase discovery (list tests/*.foo
files), test independence , proper reporting?
if can use pytest test runner, pretty straightforward using parametrize
decorator:
import pytest, glob all_files = glob.glob('some/path/*.foo') @pytest.mark.parametrize('filename', all_files) def test_one_file(filename): # actual test
this automatically name tests in useful way, can see files have failed:
$ py.test ================================== test session starts =================================== platform darwin -- python 3.6.1, pytest-3.1.3, py-1.4.34, pluggy-0.4.0 [...] ======================================== failures ======================================== _____________________________ test_one_file[some/path/a.foo] _____________________________ filename = 'some/path/a.foo' @pytest.mark.parametrize('filename', all_files) def test_one_file(filename): > assert false e assert false test_it.py:7: assertionerror _____________________________ test_one_file[some/path/b.foo] _____________________________ filename = 'some/path/b.foo' @pytest.mark.parametrize('filename', all_files) def test_one_file(filename): [...]
Comments
Post a Comment