我想使用google test编写一个派生自:: testing :: Test的类,并使用大部分构造函数或SetUp和TearDown()为其添加功能.看起来SetUp/TearDown是目前为止的方法.我的问题是:
假设我们有一个像这样的小测试夹具:
TEST_F (PerformanceTest, Inputs)
{
EXPECT_EQ (0.0, performSaxpy(10, 4.0F, 3.0F, 2.0F));
EXPECT_EQ (0.0, performSaxpy(1, 5.0F, 4.0F, 3.0F));
EXPECT_EQ (0.0, performSaxpy(10, 12.0F, 2.0F, 1.0F));
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是,当调用SetUp()函数时,我想要在其中的代码来查询测试夹具类的名称(PerformanceTest),以及测试对象的名称(输入).
为什么我需要这样做?因为我想将测试夹具的结果写入xml文件.由于各种原因,我无法使用谷歌测试已经提供的默认XML输出格式.但是,在google test的默认XML输出中,我们得到了测试夹具类和测试对象的名称,所以希望我们可以通过自定义来实现...这可能吗?
所以我看到了一些关于如何找到架构的字节顺序的例子.假设我们有一个指向int数据类型的整数指针.让我们说int值是0x010A0B12.在小端架构中,最低有效字节(即12)将存储在最低内存地址中,对吧?因此,4字节整数中的最低字节为12.
现在,检查.如果我们声明了一个char指针p,并且将整数指针强制转换为char*并将其存储在p中,并打印出取消引用的p值,我们将获得该架构的字节序的线索.如果它是12,我们就是小尾数; 01表示大端.听起来真的很整洁......
int a = 0x010A0B12;
int *i = &a;
char *p = (char*)i;
printf("%d",*p); // prints the decimal equivalent of 12h!
Run Code Online (Sandbox Code Playgroud)
这里有几个问题,真的.由于指针是强类型的,字符指针不应该严格指向char数据类型吗?用%d打印的是什么?难道我们不应该用%c打印字符吗?
我使用Ctest来运行一堆使用add_test注册的Google测试。当前,这些测试没有任何参数。但是,我想在运行ctest时为它们提供所有参数(所有参数都通用,特别是--gtest_output = xml)。
我听说使用--test-command选项可以做到这一点,但是,我看到我们需要将--test-command和--build-and-test一起使用。有这种用法的例子吗?
如下所示,我有一个具有几个位域的结构。我也有一个包含易失性64位值和此结构的联合。通过联合访问的结构更改是否也易变?
也就是说,由于结构和volatile int共享相同的内存位置,对结构的访问是否还会导致每次访问都访问内存,还是编译器将它们存储在寄存器中?
typedef struct {
uint64 my_info_1:12;
uint64 my_info_2:16;
uint64 reserved: 36;
} my_info_s;
typedef union {
my_info_s my_info_struct;
volatile unsigned long long my_info_vol; //64 bit
} my_info_u;
my_info_u my_info;
//Are these volatile accesses?
my_info.my_info_1 = 4;
my_info.my_info_2 = 8;
//This is the motivation- update a bunch of bitfields, but set them in one shot.
atomic_set(atomic_location, my_info.my_info_vol);
Run Code Online (Sandbox Code Playgroud)
由于某些实时限制,我无法使用锁/互斥锁来实现此目的。
在K&R C编程书中,我遇到了这个用于字符串复制的代码片段:
/* strcpy: copy t to s; pointer version 3 */
void strcpy(char *s, char *t)
{
while (*s++ = *t++)
;
}
Run Code Online (Sandbox Code Playgroud)
这正确地复制了两个字符数组(当然它确实如此).我的问题是,为什么它的工作方式呢?里面似乎没有任何条件检查.有一个作业和一个后期增量.我的直觉是这总是评估为真(类似于while(1)总是评估为true,我们需要在某个地方休息以摆脱循环.
循环内部也没有任何东西.没有绑定检查,没有ifs,没有.这对我来说似乎非常危险和鲁莽.有人可以带我走过这个吗?谢谢.
在学习分叉和管道时,我遇到了以下优秀教程:https://www.cs.rutgers.edu/~pxk/416/notes/c-tutorials/pipe.html
但是,本教程将讨论如何在最后一个父级生成的2个子进程之间建立管道.虽然它做得很好,但是某段代码让我困惑了一段时间:
while ((pid = wait(&status)) != -1) /* pick up all the dead children*/
fprintf(stderr, "process %d exits with %d\n", pid, WEXITSTATUS(status));
exit(0);
Run Code Online (Sandbox Code Playgroud)
我真的很困惑wait(&status)(是的,我已经阅读了http://linux.die.net/man/2/wait上的手册页).我们只是声明一个int status,从来没有给它一个值,只是把它传递给等待.此状态是否在wait()功能中透明设置?
手册页说:
wait():成功时,返回已终止子进程的进程ID; 出错时,返回-1.
所以在上面的代码行中,while循环在wait(&status)返回-1 时退出.这很不耐烦:有错误,为什么?我们如何确保父母一直在旋转,直到所有孩子都正常终止?无论如何,'状态'是什么,它是如何设定的?
编辑:要添加,该程序确实编译和运行完美.
c ×4
googletest ×2
unit-testing ×2
casting ×1
cmake ×1
ctest ×1
endianness ×1
linux ×1
pointers ×1
struct ×1
unions ×1
volatile ×1
waitpid ×1
while-loop ×1
xml ×1