怎样保证代码正确性(总结)
通过两种手段结合来保证代码的正确性,Program Proofs和Testing。
1.Program Proofs
1.Program Proofs
说白了就是代码注释。C#中函数的注释分为三部分<summary><param><returns>。好的注释需要指明调用函数的pre-condition,post-condition并且assert函数输出是正确的。例如判断素数的函数IsPrime(int n)。它的注释应该这样写:<summary>Determine whether the input value is prime</summary><param>n is greater than or equal to 2</param><returns>true if n is prime, false otherwise</returns>
2.Testing
对于一个函数,至少确保每一行都运行一次。还需要测试的内容有:Right-BICEP
Right-正确(结果是否正确?)通过一系列输入数据测试,测试数据可以放在数据文件中。测试数据应该包括BICEP。
Boundary-边界条件(边界条件都正确吗?)
Inverse-反向关联(能测试反向关联吗?)通过反向逻辑来验证结果。例如检查某条记录是否成功插入了数据库,可通过查询这条记录来验证。
Cross-交叉检查(能交叉检查结果吗?)可以用实现相同功能的其他函数来交叉检测当前结果。
Exception-错误条件(能强制错误条件发生吗?)测试可能的无效参数和环境因素。如果参数非法会发生什么?网线断了?打印机出错?断电了?磁盘用满?...
Performance-性能(是否满足性能要求?)系统用户数量?10个用户系统响应时间?100个用户?1000个用户?用户能接受的响应时间?(在user requirement的quality of service中描述)
3.Boundary测试
需要测试的边界条件有:CORRECT
C-Conformance 输入数据一致性。例如期望用户名是email@前的地址,如果没有@标志代码该怎么处理?是否抛出一个异常?
O-Ordering 顺序性。例如一个定餐系统,如果菜单反序输入呢?如果随机输入呢?
R-Range 区间性。如果输入一个索引是负数?索引的问题都需要测试-开始的索引等于结束的索引?开始的索引小于结束的索引?索引是负数?索引大于允许的值?...
R-Referrence 引用。在一个函数中引用其他函数,需要满足引用函数的pre-condition。如果在pre-condition不能满足时,确保程序的行为时正确的。
E-Existence 存在性。考虑如果输入的数据是null?0?空字符串?
C-Counting 基数性。遵循“0-1-N"原则。例如报表显示top 10记录,如果是0条记录系统的行为?1条记录呢?10条记录呢?
T-Time 时间性。相对时间:网络访问超时了该怎么办?绝对时间:不同的client间时间同步吗?(避免这样的笑话,汽车经过两个收费站,从两张发票的时间上看,车速竟超过了1000KM/H)并发访问问题?
4.无效参数在哪控制?
遵循"别让野蛮人进门”的原则。软件系统中任何面向外部的部分,例如UI和系统接口,负责检查输入数据的有效性,都要进行无效数据处理。这样就保证了系统各层次间数据一致,也避免了重复检测数据。