zoukankan      html  css  js  c++  java
  • Assert(断言) 的用法

    Assert

    Assert是断言的意思,头文件为assert.h,

    assert是一个宏

    功 能: 测试一个条件并可能使程序终止

    用 法: void assert(int test);

    在单元测试中经常使用断言

    断言只有在Debug模式下才有效,它可以有两种形式

    1.assert Expression1

    2.assert Expression1:Expression2

    其中Expression1应该总是一个布尔值,Expression2是断言失败时输出的失败消息的字符串。如果Expression1为假,则抛出一个 AssertionError,这是一个错误,而不是一个异常,也就是说是一个不可控制异常(unchecked Exception),AssertionError由于是错误,所以可以不捕获,但不推荐这样做,因为那样会使你的系统进入不稳定状态。

    官方解释是:编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言。

    通俗一点说:编写代码时,我们假设代码运行到某行时,某些变量的值应该是等于多少,如果不等于,说明程序逻辑不对,可能造成不稳定,

    比如,我之前定义了一个变量m ,在程序运行过程中m的值是会改变的,依照正确的思路,程序运行到100行时m的值应该是100,那么,我就在程序的第101行写上 assert(m=100);

    如果m==100,那么assert返回true,如果m!=100,那么assert会返回false,程序运行到这里就会出现断言错误,

    可见assert很大程度上辅助测试代码的,让代码更强壮更稳定

    用法验证:

    程序实例1:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    // 0001.cpp : Defines the entry point for the console application.
    //
     
    #include "stdafx.h"
    #include<assert.h>
    #include<stdio.h>
    #include<stdlib.h>
    struct ITEM
     
    {
         
        int key;
         
        int value;
         
    };
     
    void additem(struct ITEM* itemptr)
     
    {
         
        assert(itemptr!=NULL);
         
    }
     
    int main(int argc, char* argv[])
    {
        additem(NULL);
         
        return 0;
         
    }

      

    image

    实例2:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    // 0001.cpp : Defines the entry point for the console application.
    //
     
    #include "stdafx.h"
    #include<stdio.h>
    #include<assert.h>
    #include<stdlib.h>
     
     
    int main(int argc, char* argv[])
    {
    FILE* fp;
     
    fp=fopen("test.txt","w");//以可写的方式打开一个文件,如果不存在就创建一个同名文件
     
    assert(fp);//所以这里不会出错
     
    fclose(fp);
     
    fp=fopen("noexitfile.txt","r");//以只读的方式打开一个文件,如果不存在就打开文件失败
     
    assert(fp);//所以这里出错
     
    fclose(fp);//程序永远都执行不到这里来
     
        return 0;
         
    }

      

    image

  • 相关阅读:
    [React] Broadcaster + Operator + Listener pattern -- 20. useBroadcaster & useListener Example
    [React] Broadcaster + Operator + Listener pattern -- 19. useBroadcaster & useListener
    [Javascript] Broadcaster + Operator + Listener pattern -- 18. Create a Win Condition with a mapDone Operator
    [Typescript Unit testing] Error Handling with Unknown
    [Typescript v3.9] ts-expect-error
    [Typescript v4.1] Template type literals
    Everything you need to know about Multi-Cloud Architecture
    几款开源NTA/IPS/NDR工具的简单比较
    安全技术研究:三大微隔离架构有何区别
    数学专业劝退指南
  • 原文地址:https://www.cnblogs.com/writeLessDoMore/p/6732522.html
Copyright © 2011-2022 走看看