2013-07-09 54 views
5

我正在写一个perl模块,带有API接口,我希望把它挂在CPAN之前写一个测试套件它。但是,由于该模块基本上只是API的接口,所有测试都需要有效的API密钥和用户。很明显,我不能在测试套件中使用我的API密钥和用户名来发布这个模块,那么处理这种事情的最佳方式是什么?我应该在本地进行测试,然后在没有测试的情况下将它放在CPAN上?有没有人遇到过这个问题,并提出一个好的解决方案?我知道写作测试是最好的练习,所以如果可以的话,我愿意这样做。谢谢!Perl的测试套件API

+0

您可以编写和部署不需要密钥或假密钥的假api来测试密钥机制。这可以通过一个环境变量与真实的api交换给那些拥有真实事物的人。 – KeepCalmAndCarryOn

+0

@KeepCalmAndCarryOn - 请参阅我的回答:) – DVK

回答

4

为什么不换行的API调用成小功能(例如函数什么也不做,但API调用),然后作为使用Test::MockObject或类似需要在嘲笑你的测试这些功能?

这甚至会更好,因为你将能够有一个从API测试不同的结果的测试(失败,失败的权威性,等...)

+1

作为一个说明:这肯定是一个解决方案相比,更喜欢“跳过测试”之一,但不如“模拟单元测试的测试100%的非API调用代码+让用户为集成测试用例提供自己的密钥和用户” – DVK

+0

这个答案也很好。您将会测试执行API返回值的位。 –

3

我做了我的文档,我的模块是无用没有API密钥清晰,使用跳跃:{}测试的结构::更多跳过所有的测试,如果关键是不存在的。你可以选择bail_out而不是跳过。

只要确保您的文档解释了如何将API密钥传递给模块。

+0

你能告诉我你的模块的名称,所以我可以看看它作为一个例子吗? – srchulo

+0

是的。给我一分钟来查看它。我没有在2年多的时间里工作过:-) –

+0

https://metacpan.org/release/VendorAPI-2Checkout-Client –

2

通常的方法我处理这样的事情是需要一个环境变量才能运行测试套件。环境变量将包含的信息的有用位(例如API密钥,主机名来连接,等等)

这里有一个如何从测试文件中处理这种事的例子。我们使用此为MongoDB分布,以检查是否有可用的服务器针对其运行:

BEGIN { 
    eval { 
     my $host = exists $ENV{MONGOD} ? $ENV{MONGOD} : 'localhost'; 
     $conn = MongoDB::MongoClient->new(host => $host, ssl => $ENV{MONGO_SSL}); 
    }; 

    if ([email protected]) { 
     plan skip_all => [email protected]; 
     exit 0; 
    } 
}; 

这一切确实是尝试连接到在MONGOD环境变量指定(或其他本地主机。)主机如果可以它会跳过所有的测试,并说明原因。跳过仍然算作非故障,所以如果没有测试服务器可用,它不会阻止模块的安装。

我有一个的.pm文件,我use在分发每.T文件的代码。

+0

这也是一个很好的答案。 –