Skip to content

Commit 8683e42

Browse files
Add more unit tests (#455)
Fixes # . ### Description This PR is used to add unit tests on the following bundles: - [x] spleen_deepedit_annotation - [x] pancreas_ct_dints_segmentation - [x] swin_unetr_btcv_segmentation - [x] pathology_tumor_detection ### Status **Ready** ### Please ensure all the checkboxes: <!--- Put an `x` in all the boxes that apply, and remove the not applicable items --> - [x] Codeformat tests passed locally by running `./runtests.sh --codeformat`. - [ ] In-line docstrings updated. - [ ] Update `version` and `changelog` in `metadata.json` if changing an existing bundle. - [ ] Please ensure the naming rules in config files meet our requirements (please refer to: `CONTRIBUTING.md`). - [ ] Ensure versions of packages such as `monai`, `pytorch` and `numpy` are correct in `metadata.json`. - [ ] Descriptions should be consistent with the content, such as `eval_metrics` of the provided weights and TorchScript modules. - [ ] Files larger than 25MB are excluded and replaced by providing download links in `large_file.yml`. - [ ] Avoid using path that contains personal information within config files (such as use `/home/your_name/` for `"bundle_root"`). --------- Signed-off-by: Yiheng Wang <[email protected]>
1 parent b4d552e commit 8683e42

20 files changed

+970
-108
lines changed

ci/unit_tests/runner.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from __future__ import annotations
1313

1414
import argparse
15+
import importlib
1516
import inspect
1617
import os
1718
import sys
@@ -107,7 +108,13 @@ def get_default_pattern(loader):
107108
test_file_name = f"test_{args.bundle}_dist" if args.dist is True else f"test_{args.bundle}"
108109
test_file = os.path.join(os.path.dirname(__file__), f"{test_file_name}.py")
109110
if os.path.exists(test_file):
110-
tests = unittest.TestLoader().loadTestsFromNames([test_file_name])
111+
loader = unittest.TestLoader()
112+
# if having the "test_order" function, will use it as the load order
113+
sys.path.append(os.path.dirname(__file__))
114+
module = importlib.import_module(test_file_name)
115+
if hasattr(module, "test_order"):
116+
loader.sortTestMethodsUsing = module.test_order
117+
tests = loader.loadTestsFromNames([test_file_name])
111118
test_runner = unittest.runner.TextTestRunner(
112119
resultclass=TimeLoggingTestResult, verbosity=args.verbosity, failfast=args.failfast
113120
)

ci/unit_tests/test_brats_mri_axial_slices_generative_diffusion.py

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import numpy as np
2121
from monai.bundle import ConfigWorkflow
2222
from parameterized import parameterized
23+
from utils import check_workflow
2324

2425
TEST_CASE_1 = [
2526
{
@@ -98,9 +99,7 @@ def test_autoencoder_train(self, override):
9899
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
99100
**override,
100101
)
101-
trainer.initialize()
102-
trainer.run()
103-
trainer.finalize()
102+
check_workflow(trainer, check_properties=False)
104103

105104
@parameterized.expand([TEST_CASE_2])
106105
def test_autoencoder_infer(self, override):
@@ -115,9 +114,7 @@ def test_autoencoder_infer(self, override):
115114
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
116115
**override,
117116
)
118-
inferrer.initialize()
119-
inferrer.run()
120-
inferrer.finalize()
117+
check_workflow(inferrer, check_properties=False)
121118

122119
@parameterized.expand([TEST_CASE_1])
123120
def test_diffusion_train(self, override):
@@ -134,14 +131,7 @@ def test_diffusion_train(self, override):
134131
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
135132
**override,
136133
)
137-
trainer.initialize()
138-
# TODO: uncomment the following check after we have monai > 1.2.0
139-
# https://github.com/Project-MONAI/MONAI/issues/6602
140-
# check_result = trainer.check_properties()
141-
# if check_result is not None and len(check_result) > 0:
142-
# raise ValueError(f"check properties for overrided train config failed: {check_result}")
143-
trainer.run()
144-
trainer.finalize()
134+
check_workflow(trainer, check_properties=False)
145135

146136
@parameterized.expand([TEST_CASE_2])
147137
def test_diffusion_infer(self, override):
@@ -156,9 +146,7 @@ def test_diffusion_infer(self, override):
156146
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
157147
**override,
158148
)
159-
inferrer.initialize()
160-
inferrer.run()
161-
inferrer.finalize()
149+
check_workflow(inferrer, check_properties=False)
162150

163151

164152
if __name__ == "__main__":

ci/unit_tests/test_brats_mri_generative_diffusion.py

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import numpy as np
2121
from monai.bundle import ConfigWorkflow
2222
from parameterized import parameterized
23+
from utils import check_workflow
2324

2425
TEST_CASE_1 = [
2526
{
@@ -112,9 +113,7 @@ def test_autoencoder_train(self, override):
112113
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
113114
**override,
114115
)
115-
trainer.initialize()
116-
trainer.run()
117-
trainer.finalize()
116+
check_workflow(trainer, check_properties=False)
118117

119118
@parameterized.expand([TEST_CASE_3])
120119
def test_autoencoder_infer(self, override):
@@ -129,9 +128,7 @@ def test_autoencoder_infer(self, override):
129128
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
130129
**override,
131130
)
132-
inferrer.initialize()
133-
inferrer.run()
134-
inferrer.finalize()
131+
check_workflow(inferrer, check_properties=False)
135132

136133
@parameterized.expand([TEST_CASE_2])
137134
def test_diffusion_train(self, override):
@@ -148,14 +145,7 @@ def test_diffusion_train(self, override):
148145
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
149146
**override,
150147
)
151-
trainer.initialize()
152-
# TODO: uncomment the following check after we have monai > 1.2.0
153-
# https://github.com/Project-MONAI/MONAI/issues/6602
154-
# check_result = trainer.check_properties()
155-
# if check_result is not None and len(check_result) > 0:
156-
# raise ValueError(f"check properties for overrided train config failed: {check_result}")
157-
trainer.run()
158-
trainer.finalize()
148+
check_workflow(trainer, check_properties=False)
159149

160150
@parameterized.expand([TEST_CASE_3])
161151
def test_diffusion_infer(self, override):
@@ -170,9 +160,7 @@ def test_diffusion_infer(self, override):
170160
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
171161
**override,
172162
)
173-
inferrer.initialize()
174-
inferrer.run()
175-
inferrer.finalize()
163+
check_workflow(inferrer, check_properties=False)
176164

177165

178166
if __name__ == "__main__":

ci/unit_tests/test_brats_mri_segmentation.py

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import numpy as np
2020
from monai.bundle import ConfigWorkflow
2121
from parameterized import parameterized
22+
from utils import check_workflow
2223

2324
TEST_CASE_1 = [ # train, evaluate
2425
{
@@ -75,13 +76,7 @@ def test_train_eval_config(self, override):
7576
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
7677
**override,
7778
)
78-
trainer.initialize()
79-
# check required and optional properties
80-
check_result = trainer.check_properties()
81-
if check_result is not None and len(check_result) > 0:
82-
raise ValueError(f"check properties for train config failed: {check_result}")
83-
trainer.run()
84-
trainer.finalize()
79+
check_workflow(trainer, check_properties=True)
8580

8681
validator = ConfigWorkflow(
8782
# override train.json, thus set the workflow to "train" rather than "eval"
@@ -91,12 +86,7 @@ def test_train_eval_config(self, override):
9186
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
9287
**override,
9388
)
94-
validator.initialize()
95-
check_result = validator.check_properties()
96-
if check_result is not None and len(check_result) > 0:
97-
raise ValueError(f"check properties for overrided train config failed: {check_result}")
98-
validator.run()
99-
validator.finalize()
89+
check_workflow(validator, check_properties=True)
10090

10191
@parameterized.expand([TEST_CASE_2])
10292
def test_infer_config(self, override):
@@ -110,13 +100,7 @@ def test_infer_config(self, override):
110100
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
111101
**override,
112102
)
113-
inferrer.initialize()
114-
# check required and optional properties
115-
check_result = inferrer.check_properties()
116-
if check_result is not None and len(check_result) > 0:
117-
raise ValueError(f"check properties for inference config failed: {check_result}")
118-
inferrer.run()
119-
inferrer.finalize()
103+
check_workflow(inferrer, check_properties=True)
120104

121105

122106
if __name__ == "__main__":

ci/unit_tests/test_endoscopic_inbody_classification.py

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from monai.bundle import ConfigWorkflow
2020
from monai.data import PILWriter
2121
from parameterized import parameterized
22+
from utils import check_workflow
2223

2324
TEST_CASE_1 = [ # train, evaluate
2425
{
@@ -77,13 +78,7 @@ def test_train_eval_config(self, override):
7778
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
7879
**override,
7980
)
80-
trainer.initialize()
81-
# check required and optional properties
82-
check_result = trainer.check_properties()
83-
if check_result is not None and len(check_result) > 0:
84-
raise ValueError(f"check properties for train config failed: {check_result}")
85-
trainer.run()
86-
trainer.finalize()
81+
check_workflow(trainer, check_properties=True)
8782

8883
validator = ConfigWorkflow(
8984
# override train.json, thus set the workflow to "train" rather than "eval"
@@ -93,12 +88,7 @@ def test_train_eval_config(self, override):
9388
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
9489
**override,
9590
)
96-
validator.initialize()
97-
check_result = validator.check_properties()
98-
if check_result is not None and len(check_result) > 0:
99-
raise ValueError(f"check properties for overrided train config failed: {check_result}")
100-
validator.run()
101-
validator.finalize()
91+
check_workflow(validator, check_properties=True)
10292

10393
@parameterized.expand([TEST_CASE_2])
10494
def test_infer_config(self, override):
@@ -112,13 +102,7 @@ def test_infer_config(self, override):
112102
meta_file=os.path.join(bundle_root, "configs/metadata.json"),
113103
**override,
114104
)
115-
inferrer.initialize()
116-
# check required and optional properties
117-
check_result = inferrer.check_properties()
118-
if check_result is not None and len(check_result) > 0:
119-
raise ValueError(f"check properties for inference config failed: {check_result}")
120-
inferrer.run()
121-
inferrer.finalize()
105+
check_workflow(inferrer, check_properties=True)
122106

123107

124108
if __name__ == "__main__":

0 commit comments

Comments
 (0)