如何对Curses应用程序进行单元测试?

时间:2016-03-29 01:54:04

标签: unit-testing ncurses

我正在开展一个宠物项目,以探索一些基于Curses的编程。为此编写单元测试的最佳方法是什么?我正在考虑Rails应用支持的一般导航类型测试(集成测试)。 (例如,我想确保我的应用程序可以打开,向下移动一个项目,增加它的优先级,将其标记为完成,然后干净地退出。)

对于更多上下文,my app使用ncursesw gem。任何测试方法都很棒。 (Ruby,C等)

3 个答案:

答案 0 :(得分:2)

与测试非curses应用程序的方式相同。从用户界面拆分逻辑,仅测试逻辑。

所以你不会测试菜单,但你会测试菜单项调用的功能。

答案 1 :(得分:2)

这取决于您要测试的方面。对于测试 ncurses ,它具有跟踪功能(编译时选项),可提供详细信息。

这对大多数人来说太低级了,并且提升了一个级别,建议一般是写(使用库)一个屏幕转储功能。该库没有提供,因为

  • 需要根据哪些信息保存(以及如何保存)
  • 该库提供了足够的功能,用户应用程序无需执行扩展

ncurses 库确实提供了屏幕转储/恢复功能,但在旧版本的ncurses中,信息以二进制形式保存(在某些方面不如人们想要的那么灵活)。在beginning of 2015进行了修订,将文件转储为文本格式。作为副作用,区分转储更加简单。

如果不进行screendump,你必须依赖一个捕获屏幕的外部框架(这往往很复杂:X/Open's page关于"easy to use"的评论是乐观的而不是现实的),或依赖有人检查屏幕并看到它们看起来正确。我使用目录编辑器选择了screendump方法,使其成为log commands并添加了一个用于执行screendump的命令。重播命令(并比较连续运行)让我测试差异。

进一步阅读:

答案 2 :(得分:-1)

您可以运行分离的tmux会话并捕获输出:

tmux -u new-session -d -x 10 -y 10 -s foo
tmux send -t foo ls ENTER
sleep .5
tmux capture-pane -p
tmux kill-session -t foo