2008-10-12 60 views
2

我有一个C#模块负责获取在Windows Vista计算机上“连接到互联网”的网络适配器列表。该模块使用“Network List Manager API”(或NLM API)遍历所有网络连接并返回IsConnectedToInternet值为true的所有网络连接。单元测试模块,检查互联网连接

我收到了一些建议,这个模块的实现在这个SO question

为了测试这个模块,我决定写一个返回基于另一种逻辑网络连接列表界面帮手,所以这将是对原始模块逻辑的一种“现实检查”。请注意,对于测试助手,我愿意使用可能被认为是生产代码不良实践的检测方法(例如,依靠诸如“Google”的一些互联网资源可用 - 以防万一关闭,被我们的内部防火墙阻止等。与部署的产品基础相比,修复测试相对容易)。

我选择的另一种检测方法是尝试使用TcpClient连接到“www.google.com:80”。我的问题:当我有多个连接的适配器(例如无线和LAN)时,检测方法会失败,其中一个出现错误“连接请求是在已连接的套接字上进行的”。

我的问题是三折:

  1. ,你会如何去一般测试这样的模块?你是否支持以不同方式做同样事情并比较结果的想法,还是一个矫枉过正的问题,我应该依靠系统的API?我的主要问题在于,预先配置系统非常困难,所以我会提前知道预期的结果。

  2. 你会建议什么替代逻辑?前面提到的问题中提到的一件事是查看路由表 - 将每个具有目标为0.0.0.0的路由条目的适配器视为“连接到Internet”,如何考虑?其他建议?

  3. 您是否明白为什么当前测试逻辑会出现“已连接”错误?

回答

4

我只能回答你关于单元测试的问题。

您正在测试的代码用您自己的话说就是“一个C#模块,负责获取在Windows Vista计算机上连接到互联网的网络适配器列表该模块使用”网络列表Manager API'(或NLM API)遍历所有网络连接并返回IsConnectedToInternet值为true的所有网络连接。“

如果我正在编写这个模块,我会首先使用NLM API的接口,将其称为... NLMAPIService。现在,对于真实的代码,创建一个实现NLMAPIService并调整实际NLM API的适配器。

为了进行测试,创建一个类FakeNLMAPI实现NLMAPIService并拥有其所有内存中的数据的某个地方,或在一个XML文件,或什么的。您的模块仅在NLMAPIService上调用方法,因此您不必根据是否测试来更改任何“真实”代码。

因此,在您的测试设置方法,您可以实例FakeNLMAPI并将它传递给你的模块,并在生产,实例化NLM API适配器。

我会假设你可以实例化和修改表示网络连接的对象。如果没有,您可以按照相同的模式伪造实际的网络连接对象。

0

UnitTests不应该访问外部资源。要UnitTest你的方法,我会将网络列表管理器API存根。

您仍然需要验收测试图层。在该测试环境中,您应该复制您希望在您的环境中支持的各种配置,设置您自己的虚拟主机,路由器,机器配置。验收测试应该使用Fitnesse这样的工具在用户体验级别完成。

2

依赖注入是一个非常方便的方式来处理这样的问题。不是直接在代码中直接使用NLM API组件,而是定义一个接口和一个实现它的类,并充当NLM API的代理。将这个类的实例传递给构造函数中的模块,让你的模块使用它。在您的单元测试中,而不是真正的代理对象,使用返回已知信息的模拟对象 - 它甚至不必引用NLM API - 用于测试模块的逻辑。当然,你的代理类也需要一些测试,但其中的逻辑要简单得多 - 可能只是一些数据编组。您可能能够说服自己的正确性,或者,如果没有,请对其进行一些手动测试以确保其正常工作。