一般单元测试的原则就是,测试SUT可控的代码,对于SUT不可控的代码进行模拟。
你这里的话,网络部分mock返回值就好。
真实的网络请求留给集成测试去做吧。
5楼 @tinyfool 你这个例子的话,后边是系统调用,所以你只需要假设出返回值就行了,具体说就是为空和合法数据。3秒踢掉就等价于返回为空嘛。
6楼 @tinyfool 按教条来说是所有函数都要测,实际来说,就测自己觉得可疑的,
题外话,这个度的把握就和程序员的专业程度极度相关了。所以和很多人的想法相反, TDD 并不是给容易犯错的初级程序员用的,因为他们根本不知道这个度,即便你说要求100%覆盖率,因为测试时候的输入数据的选择是很有讲究的,所以很有可能是写了一堆不痛不痒无意义的测试代码。相反高级程序员就能很敏锐的识别易错函数,TDD 是为这类人准备的
应该不用分成要或不要网络. 而是要 stub 一下关键的资源. 可以是个web 服务,返回指定数据啥的. 拙见见笑.
我用过 Python 可以动态替换一些函数. 就很容易做到 Mock or Stub 测试了. 不用太费力. 目标是为了组织足够的测试用例 来确保功能是ok的. 就是一组TestCase. 测试数据 是录制和抓取的样例数据 最难的是那种不可序列化的对象 or 环境依赖. 我的方法就是数据模拟. 不可能真的去建个socket啥的. 就是模拟数据.
真的实行起来, 也挺难的, 尤其是人员比较多, 测试用例经常被破坏. 如果在原有代码里插入测试代码 更混乱. 稍微进化一些的方法是: 继承一个class 覆盖实现要模拟的函数. 装配数据就好了. 或者利用语言的特性. python可以加@decorator
有个概念是 可测试代码 和 不可测试代码。 要是想支持测试, 肯定要额外调整一些代码才可以的. 而这个调整搞不好 还会带入更多bug. 极端的人也反对做调整. 但是想想, 产品真的上线以后, 每次打一个版本, 如果没有办法快速验证所有功能,是多么可怕的事。即便事后找到谁带入了新bug 也没什么意义. 该造成问题的已经造成了。
总之, 能做到TDD的 从上到下都是很认可的才行。
举个例子.
@TestWrap
def getURL( s) :
balabala....
def TestWrap(s):
if testEnable:
return testdata.get(xxx);
return s