github上C语言基础实验项目,cutest: 转自github上的C语言单元测试项目,自己主要用来进行单片机开发时候的单元测试…

github上C语言基础实验项目,cutest: 转自github上的C语言单元测试项目,自己主要用来进行单片机开发时候的单元测试…HowToUseYouc Youcanalsoad Your

How To Use

You can use CuTest to create unit tests to drive your development

in the style of Extreme Programming. You can also add unit tests to

existing code to ensure that it works as you suspect.

Your unit tests are an investment. They let you to change your

code and add new features confidently without worrying about

accidentally breaking earlier features.

Licensing

For details on licensing see license.txt.

Getting Started

To add unit testing to your C code the only files you need are

CuTest.c and CuTest.h.

CuTestTest.c and AllTests.c have been included to provide an

example of how to write unit tests and then how to aggregate them

into suites and into a single AllTests.c file. Suites allow you

to put group tests into logical sets. AllTests.c combines all the

suites and runs them.

You should not have to look inside CuTest.c. Looking in

CuTestTest.c and AllTests.c (for example usage) should be

sufficient.

After downloading the sources, run your compiler to create an

executable called AllTests.exe. For example, if you are using

Windows with the cl.exe compiler you would type:

cl.exe AllTests.c CuTest.c CuTestTest.c

AllTests.exe

On Unix you should type:

gcc AllTests.c CuTest.c CuTestTest.c

./a.out

This will run all the unit tests associated with CuTest and print

the output on the console. You can replace cl.exe with gcc or

your favorite compiler in the command above.

Detailed Example

Here is a more detailed example. We will work through a simple

test first exercise. The goal is to create a library of string

utilities. First, lets write a function that converts a

null-terminated string to all upper case.

Ensure that CuTest.c and CuTest.h are accessible from your C

project. Next, create a file called StrUtil.c with these

contents:

#include “CuTest.h”

char* StrToUpper(char* str) {

return str;

}

void TestStrToUpper(CuTest *tc) {

char* input = strdup(“hello world”);

char* actual = StrToUpper(input);

char* expected = “HELLO WORLD”;

CuAssertStrEquals(tc, expected, actual);

}

CuSuite* StrUtilGetSuite() {

CuSuite* suite = CuSuiteNew();

SUITE_ADD_TEST(suite, TestStrToUpper);

return suite;

}

Create another file called AllTests.c with these contents:

#include “CuTest.h”

CuSuite* StrUtilGetSuite();

void RunAllTests(void) {

CuString *output = CuStringNew();

CuSuite* suite = CuSuiteNew();

CuSuiteAddSuite(suite, StrUtilGetSuite());

CuSuiteRun(suite);

CuSuiteSummary(suite, output);

CuSuiteDetails(suite, output);

printf(“%s\n”, output->buffer);

}

int main(void) {

RunAllTests();

}

Then type this on the command line:

gcc AllTests.c CuTest.c StrUtil.c

to compile. You can replace gcc with your favorite compiler.

CuTest should be portable enough to handle all Windows and Unix

compilers. Then to run the tests type:

./a.out

This will print an error because we haven’t implemented the

StrToUpper function correctly. We are just returning the string

without changing it to upper case.

char* StrToUpper(char* str) {

return str;

}

Rewrite this as follows:

char* StrToUpper(char* str) {

char* p;

for (p = str ; *p ; ++p) *p = toupper(*p);

return str;

}

Recompile and run the tests again. The test should pass this

time.

What To Do Next

At this point you might want to write more tests for the

StrToUpper function. Here are some ideas:

TestStrToUpper_EmptyString /* pass in “” */

TestStrToUpper_UpperCase /* pass in “HELLO WORLD” */

TestStrToUpper_MixedCase /* pass in “HELLO world” */

TestStrToUpper_Numbers /* pass in “1234 hello” */

As you write each one of these tests add it to StrUtilGetSuite

function. If you don’t the tests won’t be run. Later as you write

other functions and write tests for them be sure to include those

in StrUtilGetSuite also. The StrUtilGetSuite function should

include all the tests in StrUtil.c

Over time you will create another file called FunkyStuff.c

containing other functions unrelated to StrUtil. Follow the same

pattern. Create a FunkyStuffGetSuite function in FunkyStuff.c.

And add FunkyStuffGetSuite to AllTests.c.

The framework is designed in the way it is so that it is easy to

organize a lot of tests.

The Big Picture

Each individual test corresponds to a CuTest. These are grouped

to form a CuSuite. CuSuites can hold CuTests or other CuSuites.

AllTests.c collects all the CuSuites in the program into a single

CuSuite which it then runs as a single CuSuite.

The project is open source so feel free to take a peek under the

hood at the CuTest.c file to see how it works. CuTestTest.c

contains tests for CuTest.c. So CuTest tests itself.

Since AllTests.c has a main() you will need to exclude this when

you are building your product. Here is a nicer way to do this if

you want to avoid messing with multiple builds. Remove the main()

in AllTests.c. Note that it just calls RunAllTests(). Instead

we’ll call this directly from the main program.

Now in the main() of the actual program check to see if the

command line option “–test” was passed. If it was then I call

RunAllTests() from AllTests.c. Otherwise run the real program.

Shipping the tests with the code can be useful. If you customers

complain about a problem you can ask them to run the unit tests

and send you the output. This can help you to quickly isolate the

piece of your system that is malfunctioning in the customer’s

environment.

CuTest offers a rich set of CuAssert functions. Here is a list:

void CuAssert(CuTest* tc, char* message, int condition);

void CuAssertTrue(CuTest* tc, int condition);

void CuAssertStrEquals(CuTest* tc, char* expected, char* actual);

void CuAssertIntEquals(CuTest* tc, int expected, int actual);

void CuAssertPtrEquals(CuTest* tc, void* expected, void* actual);

void CuAssertPtrNotNull(CuTest* tc, void* pointer);

The project is open source and so you can add other more powerful

asserts to make your tests easier to write and more concise.

Please feel free to send me changes you make so that I can

incorporate them into future releases.

If you see any errors in this document please contact me at

.

Automating Test Suite Generation

make-tests.sh will grep through all the .c files in the current

directory and generate the code to run all the tests contained in

them. Using this script you don’t have to worry about writing

AllTests.c or dealing with any of the other suite code.

Credits

[02.23.2003] Dave Glowacki has added

(1) file name and line numbers to the error messages, (2)

AssertDblEquals for doubles, (3) AssertEquals_Msg version of

all the AssertEquals to pass in optional message which is

printed out on assert failure.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218144.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午7:56
下一篇 2026年3月18日 上午7:56


相关推荐

  • idea设置删除一行快捷键_删除空白页快捷键

    idea设置删除一行快捷键_删除空白页快捷键IDEA删除当前一行快捷键默认是Ctrl+Y但是有时候会和反撤销键冲突,所以还是自己设置一下也可以自定义双击选中输入框,在键盘上按下ctrl+y就可以了。然后点击OK就可以了当然你也可以直接使用Ctrl+X剪切的快捷键,也是可以充当删除当前行的快捷键…

    2025年9月29日
    6
  • 从数据库、代码和服务器对PHP网站Mysql做性能优化

    从数据库、代码和服务器对PHP网站Mysql做性能优化

    2021年9月20日
    53
  • JSON字符串,JSON对象的相互转换

    JSON字符串,JSON对象的相互转换此处介绍几种 JSON 转换的几种方法 使用 GsonObjectMa 此为 Google 提供的一个转换工具添加依赖 使用谷歌的 Gson 转换依赖 dependency groupId com google code gson groupId artifactId gson artifactId dependency

    2026年3月17日
    2
  • Windows进程间通信—命名管道

    命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。与Socket网络通信相比,命名管道不再需要编写身份验证的代码。将

    2021年12月27日
    50
  • 拆解养龙虾成本 看完果断劝退

    拆解养龙虾成本 看完果断劝退

    2026年3月16日
    1
  • 车载以太网概述

    车载以太网概述1 什么是车载以太网 车载以太网是用于连接汽车内各种电气设备的一种物理网络 车载以太网的设计是为了满足车载环境中的一些特殊需求 例如 满足车载设备对于电气特性的要求 EMI RF 满足车载设备对高带宽 低延迟以及音视频同步等应用的要求 满足车载系统对网络管理的需求等 因此可以理解为 车载以太网在民用以太网协议的基础上 改变了物理接口的电气特性 并结合车载网络需求专门定制了一些新标准 针对车载

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号