Python unittest框架是否支持发现嵌套测试?嵌套测试结构能否适配unittest运行?
Let's break down your question and the issue you're facing step by step:
Core Answer
Short and simple: No, unittest cannot automatically detect or run nested test functions like the ones you've defined inside testJobs.
Why Your Current Setup Isn't Working
Take a look at your test code structure:
class HerclTests(unittest.TestCase): def testJobs(self): def testJobSubmit(): jid = "foobar" assert jid,'hercl job submit failed no job_id' return jid def testJobShow(jid): jid = "foobar" out,errout=bash(f"hercl job show --jid {jid} --form json") assert 'Job run has been accepted by airflow successfully' in out,'hercl job show failed'
The unittest framework has strict rules for identifying tests:
- Tests must be direct methods of a
TestCasesubclass - Method names must start with
test_(yourtestJobsfollows this, but the inner functions don't meet either requirement)
When you tried running testJobSubmit via pytest, you got that error because even pytest (which works seamlessly with unittest) can't dig into method bodies to find nested functions as valid test cases. Unittest's discovery logic just doesn't traverse that deep.
How to Adjust Your Tests for unittest
You have two solid options to fix this:
1. Promote Nested Functions to Class-Level Test Methods
This is the standard, recommended approach for unittest. Turn each nested function into its own test method with the test_ prefix:
class HerclTests(unittest.TestCase): def setUp(self): # Optional: Use setUp to share common data across tests self.jid = "foobar" def test_job_submit(self): self.assertIsNotNone(self.jid, 'hercl job submit failed no job_id') def test_job_show(self): out, errout = bash(f"hercl job show --jid {self.jid} --form json") self.assertIn( 'Job run has been accepted by airflow successfully', out, 'hercl job show failed' )
Pro tip: Use unittest's built-in assertion methods (like self.assertIsNotNone, self.assertIn) instead of raw assert—they provide more detailed test failure reports to help debug issues faster.
2. Use Helper Methods for Grouped Logic
If you want to keep related steps grouped but don't want them to be separate tests, create non-test helper methods (prefix with an underscore to signal they're not intended as tests) and call them from a single test method:
class HerclTests(unittest.TestCase): def _submit_job(self): jid = "foobar" self.assertIsNotNone(jid, 'hercl job submit failed no job_id') return jid def _show_job(self, jid): out, errout = bash(f"hercl job show --jid {jid} --form json") self.assertIn( 'Job run has been accepted by airflow successfully', out, 'hercl job show failed' ) def test_full_job_flow(self): # Run both steps in one cohesive test jid = self._submit_job() self._show_job(jid)
This keeps your related code organized while still playing by unittest's rules.
Final Note
Nested functions inside test methods will never be recognized as valid tests by unittest. Your best bet is to either elevate them to class-level test methods or refactor them into helper functions called from valid test methods.
内容的提问来源于stack exchange,提问作者WestCoastProjects

