我有一个Python单元测试,它将测试一个使用操作系统访问查看是否允许写访问。如果没有,则通过stderr返回一条消息,表示“不允许写访问”
claas MyUnitTests(unittest.TestCase):
@mock.patch('os.access')
def test_save_test_data_no_write(self, os_access):
os_access.return_value = False
with captured_output() as (std_out, std_err):
tcs.my_method_to_test(self.test_dir_name, "non exist dir", *file_params)
msg = std_err.getvalue()
self.assertIn("No write access", msg)
@contextmanager
def captured_output():
map_out, map_err = StringIO(), StringIO()
orig_out, orig_err = sys.stdout, sys.stderr
try:
sys.stdout, sys.stderr = map_out, map_err
yield sys.stdout, sys.stderr
finally:
sys.stdout, sys.stderr = orig_out, orig_err
如果我将此测试作为单个测试或单个模块(仅此类中的测试)运行,它就可以正常工作。
python -m unittest my_unit_test.MyUnitTest.test_save_test_data_no_write
python -m unittest discover -p *test.py
我不太清楚是什么原因造成的。我的问题是
-
为什么stderr会改变?其他测试是否在可能与stderr冲突的其他线程中运行?
-
有没有一种不同的方法来编写测试,让它工作或围绕它工作?