1.CUnit生成测试程序
2.equals()和==到底有什么区别啊?
3.C#中关于字典(Dictionary)的方法源s方法源使用
4.很开心,在使用mybatis的码e码过程中我踩到一个坑。
CUnit生成测试程序
要生成测试程序,方法源s方法源首先我们需要编写被测函数test.c:c
<!-- file: test.c --> int maxi(int i,码e码 int j) {return i > j ? i : j;
}
接下来,定义测试用例和测试包在testcase.c中:c
<!-- test cases and test suite functions --> void testIQJ() {CU_ASSERT_EQUAL(maxi(1,方法源s方法源 1), 1);
CU_ASSERT_EQUAL(maxi(0, -0), 0);
}
void testIGJ() {CU_ASSERT_EQUAL(maxi(2, 1), 2);
CU_ASSERT_EQUAL(maxi(0, -1), 0);
CU_ASSERT_EQUAL(maxi(-1, -2), -1);
}
void testILJ() {CU_ASSERT_EQUAL(maxi(1, 2), 2);
CU_ASSERT_EQUAL(maxi(-1, 0), 0);
CU_ASSERT_EQUAL(maxi(-2, -1), -1);
}
CU_TestInfo testcases[] = {{ "Testing i equals j:", testIQJ},码e码exe格式源码
{ "Testing i greater than j:", testIGJ},方法源s方法源
{ "Testing i less than j:", testILJ},码e码
{ NULL, NULL}
};
<!-- test suite initialization and cleanup functions --> int suite_success_init() { return 0; }int suite_success_clean() { return 0; }
CU_SuiteInfo suites[] = {{ "Testing the function maxi:", suite_success_init,方法源s方法源 suite_success_clean,码e码 testcases},方法源s方法源
{ NULL, NULL}
};
然后,在Main.c中运行测试函数,码e码这里包含了命令行选项的方法源s方法源处理:c
<!-- Main.c for running the tests --> int main(int argc, char* argv[]) {// ... (command line options parsing and test execution)
}
最后,Makefile用于编译和清理:make
INC = -I/usr/local/include/CUnitLIB = -L/usr/local/lib/
all: func.c test_func.c run_test.c
gcc -o test $(INC) $(LIB) -lcunit $^
clean:rm -rf *.o test
将这些文件结合在一起,码e码你就可以通过`make all`编译生成测试程序,方法源s方法源然后运行`./test`来执行测试了。直播 源码下载在运行时,可以通过命令行选项控制输出模式和错误处理行为。扩展资料
继Junit CppUnit的成功后, c语言环境下也出现了开发源码的白盒测试用例CUnit。CUnit以静态库的形式提供给用户使用,用户编写程序的时候直接链接此静态库就可以了。它提供了一个简单的单元测试框架,并且为常用的数据类型提供了丰富的断言语句支持。equals()和==到底有什么区别啊?
1、功能不同"=="是判断两个变量或实例是不是指向同一个内存空间。
"equals"是判断两个变量或实例所指向的内存空间的值是不是相同。
2、定义不同
"equals"在JAVA中是一个方法。
"=="在JAVA中只是一个运算符合。
例子:
Student student1 = new Student();
Student student2 = new Student();
System.out.println(student1.equals(student2));
System.out.println(student1 == student2);
3、其它网站源码运行速度不同
"=="比"equals"运行速度快,因为"=="只是比较引用。
"equals"比"=="运行速度要慢。
扩展资料
equals()方法特点:
1、自反性:x.equals(x)返回true;
2、对称性:若x.equals(y)为true,则y.equals(x)亦为true;
3、传递性:若x.equals(y)为true且y.equals(z)也为true,则x.equals(z)亦为true;
4、一致性:x.equals(y)的第一次调用为true,那么x.equals(y)的第二次、第三次、第n次调用也均为true,前提条件是没有修改x也没有修改y;
5、对于非空引用x,object wait源码x.equals(null)永远返回为false。
参考资料:
C#中关于字典(Dictionary)的使用
常用的取值方法有2种:
方法1:先判断是否存在,如果存在再进行取值
if(aDictionary.ContainsKey(key)) { var value = Dictionary[key]; }
方法2:使用 TryGetValue
int value; aDictionary.TryGetValue(key, out value);
项目中,如果只是要取值,推荐使用TryGetValue来获取。
原因:
方法1中ContainsKey执行了一次方法,Dictionary[key]再次执行了一次方法,整个取值过程调用了2次方法。而方法2的TryGetValue只调用了一次方法。当然并不是调用的方法越多越耗性能,看源码后就能理解。
下面看看具体的源码
方法1:
方法2:
通过源码可以看到,这几个方法都获取值都要通过FindEntry(key)来实现
可以看出通过key来获取HashCode,然后通过equal比对值,字典存储中会给key一个对应的hashcode,如果数据过多,nasm汇编 源码那么hashCode也可能重复,所以需要进行比较。时间主要花费在这上面。
那么结论显而易见,如果只是取值,直接用TryGetValue花费更小,更快速,更安全,找不到value时返回false;
在通过一个测试代码来验证时间的花费:
查找不存在的值时花费时间几乎相同
查找的值存在时,可以看出时间接近2倍
另外在提一下关于Keys的,因为在字典中键值对是成对存储的,使用keys会单独拿出所有的key来组成一个关于Key的数组,会产生额外的CG,如果不是要单独对keys进行处理,推荐少用这个。
用Unity自带的Profile来进行测试
调用Keys方法时
未调用Keys方法
很开心,在使用mybatis的过程中我踩到一个坑。
在实际开发过程中,我遇到了mybatis的一个问题,觉得很有必要记录下来并分享给大家。
这个坑的具体情况是这样的:在mybatis中,OgnlOps.equal(0,"")返回的是true,这违背了我们的常识,并且会带来一些问题。
接下来,我将按照遇到问题 -> 分析问题 -> 解决问题的思路,用追踪源码的方法,对这个问题进行剖析。
同时,我会分享一下我是如何通过逆向排查的方法,通过Debug模式找到关键源码,并解决这个问题的。
本文源码:mybatis 3.5.3版本。
背景介绍和需求分析
为了简化问题,我们假设有一个订单表,表结构如下:
为了方便说明,我们假设表里面只有两条数据:订单号为的订单状态为0(关闭),订单号为的订单状态为1(开启)。
已经开发好的功能是模糊查询订单名称,接口如下:
现在需要在已有功能上添加一个根据状态过滤订单的功能。
假设某个页面有这样的一个下拉框,可以根据订单状态过滤订单数据。
准备开发
现在明确了需求,根据订单状态进行过滤。
很简单,最主要的修改地方就是对mapper.xml的修改。
开始自测,遇到问题
为了确保功能的正确性,我进行了单元测试,分别传入状态0和1,预期的结果是各自查询出一条数据。
然而,执行结果却与预期不符,status=0时查询出2条数据,status=1时查询出1条数据。
当时我意识到这个问题可能并不简单,于是决定分析原因。
分析问题
为了找到问题的根源,我首先将sql打印出来,查看最终执行的sql。
通过分析sql,我发现当status为0时,mybatis并没有给我们拼接where关键字。
逆向排查法
为了定位问题,我通过日志找到了关键源码,并使用逆向排查的方法进行追踪。
最终,我发现问题的根源在于mybatis中的OgnlOps.equal(0,"")返回了true。
关键源码
通过分析源码,我找到了导致这个问题的关键代码,并解决了这个问题。
解决问题
为了解决这个问题,我修改了mapper.xml文件中的if标签,最终实现了预期效果。
总结
这次的经历让我深刻认识到,在开发过程中遇到问题时,要善于分析、思考和总结,才能不断提升自己的技能。