- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用Python服务来监视文件系统中的目录。当发现文件已在其中创建或移动时,它将文件的路径发送到Kafka队列中。我的服务工作完全符合我的需要,但是我的问题是我应该至少拥有90%的单元测试覆盖率。我对Python相对较新,并且以前从未使用过任何语言的单元测试,因此我感到自己的确超出了我的理解范围。我只是无法确定如何测试这些类。
这是监视文件系统的类,我正在使用watchdog库。
我将handler=FileHandler
参数添加到 init 中,因为我认为可以使用该参数将可用于测试的伪处理程序传递给该类,但这感觉不必要地复杂。
class FileSystemMonitor:
def __init__(self, target_path, kafka_queue, handler=FileHandler):
self.path = target_path
self.queue = kafka_queue
self.handler = handler(self.queue)
def start(self):
observer = Observer()
observer.schedule(self.handler, self.path, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
def parse_args():
path = sys.argv[1] if len(sys.argv) > 1 else '.'
queue = sys.argv[2] if len(sys.argv) > 2 else 'default'
return path, queue
if __name__ == "__main__":
path, queue = parse_args()
monitor = FileSystemMonitor(path, queue)
monitor.start()
class FileHandler(PatternMatchingEventHandler):
def __init__(self, queue):
super(FileHandler, self).__init__(ignore_patterns=["*/.DS_Store"], ignore_directories=True)
self.queue = queue
def on_any_event(self, event):
super(FileHandler, self).on_any_event(event)
#print(event, self.queue)
result = kafkaProducer.send_msg(self.queue, event.src_path, event.event_type)
print("Handler:", result)
return result
最佳答案
FileSystemMonitor.start
非常难以测试,因为它会阻塞直到发生外部事件,但是由于阻塞,测试无法轻易使事件发生。我想您可以使用多线程或多处理或仅使用计时器来完成一些技巧,但这会给您的测试增加一些不确定性,这是我不喜欢的。
更明确的方法是允许调用者指定while
循环内发生的情况,以便在测试中引发异常,而在生产代码中将调用time.sleep
。
class FileSystemMonitor:
def __init__(self, target_path, kafka_queue, handler=FileHandler):
self.path = target_path
self.queue = kafka_queue
self.handler = handler(self.queue)
def start(self, loop_action):
observer = Observer()
observer.schedule(self.handler, self.path, recursive=True)
observer.start()
try:
while True:
loop_action()
except KeyboardInterrupt:
observer.stop()
observer.join()
def fake_loop_action():
raise KeyboardInterrupt
def test_FileSystemMonitor():
# Initialize target_path, kafka_queue and handler here.
# You might want to use test doubles.
monitor = FileSystemMonitor(target_path, kafka_queue, handler)
monitor.start(loop_action=fake_loop_action)
time.sleep
。您甚至可以立即在通话中指定延迟。
monitor.start(loop_action=lambda: time.sleep(1))
关于python-3.x - 如何为直到Keyboardinterrupt之前运行且不返回任何内容的类编写单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56894411/
代码如下: try: input() # I hit Ctrl+C except Exception as e: print(str(e)) 这是回溯: Traceback (most
我使用这段代码来中断函数执行,而没有任何错误回溯。 if __name__ == "__main__": try: main() except KeyboardInte
有人可以向我解释以下内容吗?让我们看一下代码: if __name__ == '__main__': try: while 1: x = 2+2
在下面的简单示例中,我用函数 foo() 做了一些事情。函数内部有一个变量a。我想做的是当程序捕捉到 KeyboardInterrupt 时,可以打印局部函数变量 a。 很明显,下面的方法是行不通的。
Cont = 1 while Cont == 1: try: while Cont == 1: counter = counter + 0.1
我有一个循环,在每次迭代中我(重新)计算一个长值向量: try: while(1): long_vec = recalculate( long_vec ) la
我目前正在使用 Twisted 在回调中的 for 循环中重复一项任务,但是如果用户通过 Ctrl-C 发出 KeyboardInterrupt,我希望 react 器在回调(一个)中中断循环。根据我
我有以下代码: while True: try: #DoSomething except KeyboardInterrupt: break 但是我不想使
我希望向我的代码添加功能,这样如果我想在任何时候终止代码,它都会安全地终止训练并保存变量。虽然我已经尝试寻找更好的解决方案,但我想捕获一个 KeyboardInterrupt异常(exception)
我有一个代码,可用于在 Ctrl+C 时停止。我想在我按 Ctrl+C 后做一些事情。因此我写: try: work() except KeyboardInterrupt: do_ot
我一直在搞一个 Django 项目。我想要实现的是 Django 项目在另一个进程中启动,而父进程启动我编写的任意代码加载(我的项目的后端)。显然,Django 进程和父进程进行通信。我希望进程可以读
我在编写启动本地 JBoss 实例的脚本时遇到了一个奇怪的问题。 我的代码看起来像这样: with open("/var/run/jboss/jboss.pid", "wb") as f: p
我在 Windows 上执行了以下测试代码: import multiprocessing import time def child() : while True : time.slee
我正在使用 Python 调用使用子进程模块的 C++ 程序。由于该程序需要一些时间才能运行,我希望能够使用 Ctrl+C 终止它。我在 StackOverflow 上看到了一些与此相关的问题,但似乎
from socket import socket, AF_INET, SOCK_STREAM sock = socket(AF_INET, SOCK_STREAM) sock.bind(("loca
在 Linux 上将 Tkinter 与 Python 结合使用,我试图通过使用 KeyboardInterrupt 异常让 Ctrl+C 停止执行,但是当我按下它时有一段时间没有任何反应。最终它“接
不知何故,我的 pycharm 调试器不再连接。 我测试了所有 ENV。另外,在 stackoverflow 上阅读它:我删除了 .idea 目录。 然而,在重新启动pycharm .idea 后总是
我正在制作一个简单的多线程端口扫描器。它扫描主机上的所有端口并返回打开的端口。问题在于中断扫描。扫描完成需要很长时间,有时我希望在扫描过程中用 C-c 终止程序。问题是扫描不会停止。主线程锁定在 qu
我正在运行这个简单的代码: import threading, time class reqthread(threading.Thread): def run(self):
如何使用 fabric 触发 Ctrl+C,换句话说,是否可以通过 bash 手动触发 KeyboardInterrupt? 最佳答案 ctrl+c 生成 SIGINT 信号。 您可以使用 kill
我是一名优秀的程序员,十分优秀!