【问题标题】:Prompt user during unit test in Perl在 Perl 的单元测试期间提示用户
【发布时间】:2011-10-03 07:59:31
【问题描述】:

我正在编写一个模块,它具有单元测试,需要运行某个外部服务器程序,如果是,则需要知道主机名和端口。

我想在运行测试套件时提示输入此信息,如果用户拒绝提供,则跳过这些测试。

最好的处理方法是什么?

谢谢

【问题讨论】:

  • 在不知道服务器程序的详细信息或您想如何检查它是否正在运行的情况下,您可以use Test::More,在您需要的地方插入提示,然后使用这些值从您的测试中的提示。 Perl 中的单元测试实际上只是另一个 Perl 脚本,除了它通常包含来自Test::Moreok()isa_ok() 等函数。
  • 我就是这么想的;我只是不确定这样做是否会以某种意想不到的方式干扰测试工具或通过 CPAN.pm 等进行的自动安装。

标签: perl unit-testing


【解决方案1】:

你在找ExtUtils::MakeMaker::prompt吗?

其他方便的功能

提示

my $value = prompt($message);
my $value = prompt($message, $default);

prompt() 函数提供了一种简单的方法来请求用于编写 makefile 的用户输入。它显示 $message 作为输入提示。如果提供了 $default,它将被用作默认值。该函数返回用户选择的$value。

如果 prompt() 检测到它没有以交互方式运行并且 STDIN 上没有任何内容,或者如果 PERL_MM_USE_DEFAULT 环境变量设置为 true,则 $default 将在没有提示的情况下使用。这可以防止自动化进程阻塞用户输入。

如果未提供 $default,则将使用空字符串。

【讨论】:

【解决方案2】:

我将对此采取不同的策略。为什么你需要用户作为中间人——尤其是自动化测试?一种明显更好的方法(根据我自己的经验)是执行以下操作之一:

  • 使服务器(主机名/端口)可以通过测试以某种方式发现。它可以是真正的可发现性,也可以是让服务器自己注册,或者,见鬼,一些配置服务。考虑到现实世界中服务器的客户端需要能够连接到服务器,这样的发现逻辑(同样,最坏的情况是某个配置文件)应该已经存在。

  • 对于一个非常高级的案例,允许测试工具能够在测试端口上启动服务器的测试实例(如果没有运行)。

请注意,如果您的服务器由于某种原因不能被检测为允许上述任何一种方法,那么 socket puppet 的答案是最好的方法。

【讨论】:

  • 所有好的建议,但是这个服务器没有任何类型的发现协议,我无法发明一个。我只是在开发一个客户端库。
  • @friedo - 不要被我发明的花哨术语所迷惑。客户端如何知道如何连接?这就是我所说的发现协议
  • @friedo:作为用户,我非常更喜欢配置文件或命令行选项,这样我就可以调用测试(甚至可能从脚本中调用?)并且不必担心出现提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 2017-12-21
  • 2021-11-09
  • 1970-01-01
  • 2018-02-16
相关资源
最近更新 更多