Skip to content

Commit f6f9509

Browse files
Merge pull request #1748 from Giskard-AI/GSK-2617
GSK-2617 Missing kwargs in a test make the whole suite fail
2 parents 86a8a59 + fcb3843 commit f6f9509

File tree

3 files changed

+49
-18
lines changed

3 files changed

+49
-18
lines changed

giskard/core/suite.py

+9-8
Original file line numberDiff line numberDiff line change
@@ -433,12 +433,9 @@ def run(self, verbose: bool = True, **suite_run_args):
433433
"""
434434
run_args = self.default_params.copy()
435435
run_args.update(suite_run_args)
436+
self.verify_required_params(run_args)
436437

437438
results: List[SuiteResult] = list()
438-
required_params = self.find_required_params()
439-
undefined_params = {k: v for k, v in required_params.items() if k not in run_args}
440-
if len(undefined_params):
441-
raise ValueError(f"Missing {len(undefined_params)} required parameters: {undefined_params}")
442439

443440
for test_partial in self.tests:
444441
test_params = self.create_test_params(test_partial, run_args)
@@ -497,10 +494,7 @@ def to_unittest(self, **suite_gen_args) -> List[TestPartial]:
497494
run_args.update(suite_gen_args)
498495

499496
unittests: List[TestPartial] = list()
500-
required_params = self.find_required_params()
501-
undefined_params = {k: v for k, v in required_params.items() if k not in run_args}
502-
if len(undefined_params):
503-
raise ValueError(f"Missing {len(undefined_params)} required parameters: {undefined_params}")
497+
self.verify_required_params(run_args)
504498

505499
for test_partial in self.tests:
506500
test_params = self.create_test_params(test_partial, run_args)
@@ -516,6 +510,13 @@ def to_unittest(self, **suite_gen_args) -> List[TestPartial]:
516510

517511
return unittests
518512

513+
def verify_required_params(self, run_args: Dict[str, Any]):
514+
required_params = self.find_required_params()
515+
undefined_params = {k: v for k, v in required_params.items() if k not in run_args}
516+
517+
if undefined_params:
518+
warning(f"Missing {len(undefined_params)} required parameters: {undefined_params}")
519+
519520
@staticmethod
520521
def create_test_params(test_partial, kwargs) -> TestParams:
521522
if isinstance(test_partial.giskard_test, GiskardTestMethod):

tests/test_programmatic.py

+26-6
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,38 @@ def test_a_greater_b_pass():
4646

4747

4848
def test_missing_arg():
49-
with pytest.raises(Exception, match="Missing 1 required parameters: {'b': <class 'int'>}"):
50-
Suite().add_test(_test_a_greater_b(a=2)).run()
49+
with pytest.warns(match="Missing 1 required parameters: {'b': <class 'int'>}"):
50+
result = Suite().add_test(_test_a_greater_b(a=2)).run()
51+
52+
assert not result.passed
53+
54+
assert len(result.results) == 1
55+
_, test_result, _ = result.results[0]
56+
assert "1 validation error" in test_result.messages[0].text
5157

5258

5359
def test_missing_args():
54-
with pytest.raises(Exception, match="Missing 2 required parameters: {'a': <class 'int'>, 'b': <class 'int'>}"):
55-
Suite().add_test(_test_a_greater_b()).run()
60+
with pytest.warns(match="Missing 2 required parameters: {'a': <class 'int'>, 'b': <class 'int'>}"):
61+
result = Suite().add_test(_test_a_greater_b()).run()
62+
63+
assert not result.passed
64+
65+
assert len(result.results) == 1
66+
_, test_result, _ = result.results[0]
67+
assert test_result.is_error
68+
assert "2 validation errors" in test_result.messages[0].text
5669

5770

5871
def test_missing_arg_one_global():
59-
with pytest.raises(Exception, match="Missing 1 required parameters: {'b': <class 'int'>}"):
60-
Suite().add_test(_test_a_greater_b()).run(a=2)
72+
with pytest.warns(match="Missing 1 required parameters: {'b': <class 'int'>}"):
73+
result = Suite().add_test(_test_a_greater_b()).run(a=2)
74+
75+
assert not result.passed
76+
77+
assert len(result.results) == 1
78+
_, test_result, _ = result.results[0]
79+
assert test_result.is_error
80+
assert "1 validation error" in test_result.messages[0].text, test_result.messages[0].text
6181

6282

6383
def test_all_global():

tests/test_suite.py

+14-4
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,25 @@ def test_default_parameters_are_used_at_runtime(german_credit_data, german_credi
2727
# This will miss dataset
2828
suite = Suite(default_params=dict(model=german_credit_model))
2929
suite.add_test(my_test)
30-
with pytest.raises(ValueError):
31-
suite.run()
30+
result = suite.run()
31+
assert not result.passed
32+
_, test_result, _ = result.results[0]
33+
assert test_result.is_error
3234

3335
# But we can pass dataset at runtime
34-
suite.run(dataset=german_credit_data)
36+
result = suite.run(dataset=german_credit_data)
37+
assert result.passed
38+
_, test_result, _ = result.results[0]
39+
assert not test_result.is_error
40+
assert test_result.passed
3541

3642
# Or we can provide it in the suite defaults
3743
suite.default_params["dataset"] = german_credit_data
38-
suite.run()
44+
result = suite.run()
45+
assert result.passed
46+
_, test_result, _ = result.results[0]
47+
assert not test_result.is_error
48+
assert test_result.passed
3949

4050

4151
def test_runtime_parameters_override_default_parameters(german_credit_data, german_credit_model):

0 commit comments

Comments
 (0)