assert测试

本文详细解析了C++中的断言assert如何工作,尤其是在调试过程中如何帮助开发者定位那些不应该发生的非法状态。通过一个简单的例子展示了assert失败时的行为,并讨论了assert在不同编译配置下的表现。

#include "stdafx.h"
#include "assert.h"

int main(int argc, char* argv[])
{  
 int a = 0;
 assert(a!=0); 
 printf("Hello World!/n");
 return 0;
}

 

此时出现"Assertion failed: a!=0" 的错误!,如果把int a = 0; 改为int a =2;则没有这个错误。

 

断言assert是仅在Debug版本起作用的宏,用于检查"不应该"发生的情况。

assert不是一个仓促拼凑起来的宏。为了不在程序的Debug版本和Release版本引起差别,assert不应该产生任何副作用。所以assert不是函数,而是宏。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。如果程序在assert处终止了,并不是说含有该assert的函数有错误,而是调用者出了差错,assert可以帮助我们找到发生错误的原因。

1:使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
2:在函数的入口处,使用断言检查参数的有效性(合法性)。
3:在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
4:一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

 

后记:参照林锐《高质量C/C++编程指南》

以下是一个使用 `assert` 测试一个字符串变量不为空且不包含 `"erro"` 的 TypeScript 代码: ```typescript function testString(input: string): void { // 确保输入不是空字符串 console.assert(input.trim() !== "", "Error: String is empty or only contains whitespace"); // 确保输入不包含 "erro" console.assert(!input.includes("erro"), "Error: String contains 'erro'"); } // 示例测试用例 const test1 = "This is a valid string"; const test2 = " "; const test3 = "This string contains erro"; testString(test1); // 应该通过测试 testString(test2); // 应该抛出错误: String is empty or only contains whitespace testString(test3); // 应该抛出错误: String contains 'erro' ``` ### 上述代码解释: 1. **函数定义**:`testString` 函数接收一个字符串参数 `input`。 2. **测试非空**:我们使用 `input.trim() !== ""` 来确保字符串不是空的或者只包含空白字符(如空格、制表符等)。 - `trim()` 方法会移除字符串两端的所有空白字符。 - 如果结果是空字符串,则认为输入无效。 3. **测试是否包含 "erro"**:使用 `input.includes("erro")` 检查字符串中是否包含子字符串 `"erro"`。 - 如果包含,则测试失败。 4. **`console.assert`**:这是一个简单的断言方法,如果第一个参数为 `false`,则会抛出一个带有第二个参数作为消息的错误。 --- ### 注意事项: - 在实际项目中,可能需要更复杂的验证逻辑,例如忽略大小写检查、支持正则表达式匹配等。 - 如果需要在单元测试框架(如 Jest 或 Mocha)中运行这些测试,可以替换 `console.assert` 为框架提供的断言方法。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值