我正在编写一个将数据保存到文件的函数。可以从多个线程或进程同时使用相同的参数(相同的数据,相同的文件)调用它。这是一个我无法避免的场景,因此我正在编写单元测试以确保它不会导致数据损坏。
为了相信我的单元测试,我想测试一下写得不好的函数就会失败。我没有成功,我的文件总是包含预期的数据。
这是一种重现(缺乏)问题的方法。文件test.txt
始终包含CONTENT
。
import io
import threading
# 1,000,000 lines: Test #0, Test #1, ..., Test #999999. About 13Mb.
CONTENT = ''.join(['Test #' + str(i) + "\n" for i in range(1000000)]).encode()
# Thread to write CONTENT to test.txt
class WriteThread(threading.Thread):
def run(self):
stream = io.BytesIO(CONTENT)
with open('test.txt', 'wb') as f:
for buffer in iter(lambda: stream.read(), b''):
f.write(buffer)
# Run 100 write threads in parallel
threads = []
for i in range(100):
threads.append(WriteThread())
for t in threads:
t.start()
for t in threads:
t.join()
我做错了吗?我很幸运吗?这是我应该依赖的行为吗?