记一次使用eclemma的蛋疼的测试经历

软件测试第二次大作业是单元测试,最后要进行一个覆盖测试,用到插件eclemma。由于被测程序带有一个GUI界面,设计器要生成一大堆代码,主要用于创建和设置控件。其中有些代码是绑定回调的,由于我的单元测试中直接调用了回调方法,没有经过闭包(xxxListener),导致闭包里的代码都是红的。

我的想法是专注于计算部分的正确性就可以,界面是设计器生成的我也没必要管它。我的用例把计算部分每个分支都覆盖了,但是由于上述原因,实际的覆盖率只有93%多一点,而作业要求是95%。

于是我开始想办法能不能屏蔽掉initComponent和构造器,结果发现没这个功能。

为了验证我的想法,即是不是一些其他代码干扰造成的,我找了个例子,果不其然。

上图的程序只有一个类HelloWorld,也是启动类。类里面只有一个方法main。然而由于这个类不是抽象的,所以编译器会自动生成个构造器。

可以看出,main的覆盖率是100%,但是就是由于有这么一个构造器,下降到了91%。而这个启动类是没必要实例化的,插件又不提供屏蔽功能,导致数据受到严重干扰。

什么垃圾插件,完全不考虑实际的需求。设计的人也是脑子有坑。

找到了点有意思的资料。。。

信息系统分析设计第二次大作业主要处理petri网,这方面的资料,特别是实例模型很难找。在查资料的时候,居然发现了这个。

基于petri网的过程建模

基于petri网的工作流建模

除了抹掉了署名,整个ppt的模版、结构和内容都像极了我们课程的课件。当然内容只是基本一致,没有现在的丰富。应该是前几届的课件,大家可以作为参考。

吐槽一下Java的ArrayList

如果我们想把一个数组转化成ArrayList,ArrayList有接受Collection的构造器,但是数组又不属于Collection。

在Arrays类(数组的功能类)中,有个asList方法接受可变参数,当然也接受数组,转化成List。但是这个List是Arrays.ArrayList,内部私有类,不是我们要的ArrayList,而且它是不可变的,add和remove都会抛异常。

于是,我们需要这样来折腾一下。

ArrayList<T> list = new ArrayList<T>(Arrays.asList(arr));

设计这个的人绝对是脑子有坑,两个函数的设计只要变一个地方,都不会如此麻烦。

联机算法 - 求最大连续子序列和

非常屌的一个算法,时间O(n),空间O(1)。只有六句,我到现在都没看明白。

//vector<int> arr;

int sum = 0;
int maxsum = INT_MIN;
for(int e : arr)
{
  sum = max(sum + e, e);
  maxsum = max(sum, maxsum);
}

cout << maxsum << endl;

这是非空的,允许为空的情况只要把第一个max第二个参数改成0就好了。

【Quora】以下哪个地方诞生了更优秀的计算机工程师,清华,斯坦福还是MIT?

我不了解斯坦福(因为只是短暂访问过几次那里),不过我对MIT和清华都比较熟悉。MIT是我的母校,而我的朋友有很多都来自清华。说实话,我觉得很难比较这两个学校的优劣。

在校园文化方面,这两个学校有很多本质的差别。而属于清华的很多特点大多并不源于这个学校本身。很多人问我为什么来自清华的创业公司寥寥无几,而来自MIT的创业公司又那么多?综合考虑所有因素,我认为其中最大的因素是自由。

清华每天晚上要熄灯。网络连接也被严格的限制着。每栋宿舍楼的入口处都有警卫。在清华,总体上的校园文化是学习最重要。在Larry Zhang这个回答中可以看到亚洲人持有一个普遍的观点,即:“MIT学生的成功有赖于他们的勤奋学习”。这个观点和事实相差万里。

没错,MIT的学生学习是很勤奋。但是这并不意味这它能培养出优秀的计算机工程师。我们中间的很多人并不是为了学习而来到这里。这些人来到MIT是想要过来hack我们所能看到的一切东西。在我的本科宿舍里,我们有焊接设备,有木材切割设备,电子仪器,备用的混凝土和木材堆放在走廊。我们很容易就能进入到器材室或者机械五金店,拿到我们所需要的所有设备。而这一切都是为了非学术的私人用途。我们有个叫Reuse的邮件列表,你可以在学校里面到处跑去收集各种别的实验室不需要的奇怪设备,包括挂载机柜的服务器和老旧的杜瓦瓶。我们也有一个没有任何端口限制的开放网络,免费的静态ip地址,全双工的千兆网络接通到每间宿舍。MIT鼓励我们使用这些资源来最大程度的满足我们对未来的想象力。在虚拟化技术普及之前,我自己的宿舍里面放了15台机器。我对门宿舍的哥们弄到了一个工业级激光器自己做了一个激光切割设备。另外一个哥们在忙着搞一个山寨的RF芯片识别设备试图找到地铁和学校的读卡器安全漏洞。还有人在宿舍自己弄了一个二层阁楼,还有人花了200美元把一个相机发射到了太空中只是为了证明这并非不可能,还有人做了个3D显示器,有人在折腾虚拟现实头盔,有人没事自己改linux 内核……

这些东西都是什么时候做的?半夜。此刻的清华断掉了他们学生的电。我已经很难想象能有比强行断掉这个国家最聪明的一批学生的电力供应更能阻碍这个国家技术前进的方法了。没有电,你怎么做自己的项目?怎么在项目早期运行自己的服务器?而在MIT,我们的公司脱胎于学生宿舍,卧室即是数据中心和实验室。

我们为此牺牲了学习的时间吗?当然。我们中的很多人来MIT本来就不是为了学习,我们来是为了做东西。

我们为此打破了很多规章制度吗?向来如此!但幸运的是MIT从来不会监督我们,没人到处盯梢,没有监视摄像头,没人告诉我们什么该做什么不该做,除非我们真的做了些对人身安全造成危险的事情。这样我们才能把整个校园(不仅仅是宿舍)变成一个高科技恶作剧的试验场,正是这些让我学到了从Python到RF设计的所有知识。而在清华,他们甚至不让我在里面照相。在每栋大楼的入口出都有一个静默严肃的保安看守。真希望清华的学生们在那里也能愉快的hack。

这些MIT的校友们现在何处?一部分成了主流计算机工程和软件公司的CEO,一部分正准备从硅谷公司辞职实现自己的下一个伟大创意。计算机工程技能首要并且本质上来自于实践经验,而不是课堂。这正是我们在那么多阴暗的夜晚里面学到的事情。

请不要误解我的话,清华的学生极其聪明,聪明,还是聪明。他们对于创造未来的渴望并不输于我们。我去过那里很多次,我的很多朋友都毕业于清华。真正的问题不在于学生,而在于学校和学校的氛围,传统的亚洲学术评估制度,以及其他一切阻碍了他们放弃学业投身实现梦想和未来的事物。

嘛,我准备去看一眼他们这学期开的新课,虽然我只是打算把它扔一边然后去搞我自己的app……

原文链接:https://www.quora.com/Who-produces-better-computer-engineers-Tsinghua-University-Stanford-or-MIT

【推荐】Zeal 离线API文档浏览器

zeal是一个windows上的开源的离线文档浏览工具,基于docset格式,可以兼容全部dash的文档。zeal没有代码片段管理的功能,只提供文档浏览功能,不过windows下的用户可算是有的用了。dash目前只提供mac上的版本,作者说有往windows上移植的打算,但迟迟没有动工。

刚安装好之后是没有文档可以看的, 需要自己下载。下载后解压到程序目录内即可,重新打开程序后就可以看了。

软件下载:http://zealdocs.org/

文档下载:http://kapeli.com/docset_links

Javascript中四种函数调用方式

为了解释方便,先创建一个函数:

function showmsg()
{
  console.log(this);
}

它的作用是打印this这个对象,也方便我们了解它到底指代什么。

一、直接调用

showmsg();

结果:

Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…} 

可知,直接调用时,其中的this就是顶层对象window。

二、作为构造函数调用

var obj = new showmsg();

结果:

showmsg {} 

调用之后,创建了一个类型和函数同名的对象。this指代这个对象。

三、作为方法调用

var obj = {showmsg: showmsg};
obj.showmsg();

结果:

Object {showmsg: function}

其中this就是那个被绑定的对象。

四、function.call

showmsg.call({});

结果:

Object {} 

call的第一个参数是什么,里面的this就是什么。如果需要传参数的话,附在后面即可。而且这种可以只调用不绑定。

此外,直接调用相当于:

showmsg.call(null);

如果第一个参数是null,那么里面的this则是顶层对象window。

作为构造函数调用相当于:

var obj = {};
obj.__proto__ = showmsg;
showmsg.call(obj);