我对软件测试(包括单元测试)本身了解不太多,只试过几次Java的JUnit和非常粗糙的类集成测试(main方法测试的一个分支),如果对问题描述本身出现知识性错误请指正。
集成测试应该说是软件测试的基础,而它的基础则是输入(可以很复杂、多次)与输出(期待结果,具体数值或者某种类型的结果)的对应。这是计算机结构本身——及与之结合的算法本身所决定的:有限步骤+确定结果。
然而了解到这些有种不太好的感觉,现在软件框架已经发达了(从Java中的LinkedList到Numpy、Mahout),测试还得人为地去想一些很基本的东西,感觉测试本身比写代码原始了不少,不知道对不对?
然后,现在人工智能特别火,虽然几十年前的“强人工智能”已经成为笑柄,但业务复杂性仍然很高(参考机器视觉),这种情况下涌现(emergence,复杂系统的特征)其实还是软件开发的一个追求。
知乎上人们嘲笑Prolog、Haskell的迂腐,但基于逻辑编程和函数式编程与计算机原理契合而言,我倒觉得单元测试及更复杂的软件测试暴露出软件开发本身的一个问题:如何让软件生命周期更有机结合在一起?目前新兴的DevOps是讲开发和运行融为一体。
这样说来软件开发可能有强调逻辑和函数(深层)构建的:自上而下先探索宏观框架然后细看实施细则,然而这两种编程/开发范式与目前主流的社会工程学相悖——绝大部分负责工程都需要一级一级地分解任务,所以命令式编程结合面向对象一直是主流。另一个问题可能是这两类编程语言的运行速度问题。
机器学习做测试一般是面向数据的——你训练了一个识别猫狗的模型,拿一些猫和狗的图片测它多少分辨正确。参考2里指出了“数据科学”仍然是“科学”的一个重要原因——没有传统算法/计算机模型的可重复性和鲁棒性。
单元/软件测试的局限和困境激发了我的一个想法,这想法基于小时候读的一个科幻小说,讲一个人遇到了奇特的计算机病毒——一个在网络系统自己生长起来的病毒,这个病毒算是AI可以跟人对话理解人类社会,至今还依稀记得小说的片段“最开始我只是几个字节。。。慢慢侵吞其他电脑里的文件。。。”。这个想法是:弱势AI(基于统计学的)能否拓展到(非全部)自动编写并测试实用软件上,软件编写软件、软件测试软件,貌似目前有一些实验品,值得期待。
这个想法的延伸是“人工生命”,计算机是死的不是生命,和它打交道会导致各种物化人的情况比如繁重的单元测试。人类一直有一个通过智能延伸(比如创造人造生命)来实现自我解放,目前的AI热某种意义上算是回声。
我是个坏学生,每天离经叛道,胡思乱想。
参考
狼来了?全球首款基于AI的智能软件测试工具问世了,它叫mabl https://blog.csdn.net/zjuxsl/article/details/79493010
机器学习中如何做单元测试(Unit Test)来检测模型稳定性? https://www.zhihu.com/question/20225527
https://en.wikipedia.org/wiki/Artificial_life