我正在测试一个生产者 - 消费者场景,生产者在尝试写入已满的队列时会阻塞.我想测试生产者线程是否正确唤醒并在消费者从完整队列中读取后按预期工作*.队列写入API在检测队列已满时调用pthread_cond_wait(),并且读取API在从队列读取后发出条件变量信号.
如何确保序列3在我的测试环境中的任何其他操作序列中出现?
*是的我想分别测试这个有限的场景; 还有其他测试可以测试整个队列的功能,这个测试是除此之外的测试.
更多细节 -
有一个管理队列的互斥锁.有2个条件变量 - 一个用于信号写入(所有写入),一个用于信号读取(所有读取).在对读condvar queue_write API块,如果队列已满.该上写condvar queue_read API块,如果队列为空.所有信号都发生在互斥体的支持下.
队列中有很多细微差别,但为了设置这个问题的上下文,这是对队列功能的充分总结.
目前,我__setattr__
在类' __init__
()方法的末尾覆盖了类' (),以防止创建新属性 -
class Point(object):
def __init__(self):
self.x = 0
self.y = 0
Point.__setattr__ = self._setattr
def _setattr(self, name, value):
if not hasattr(self, name):
raise AttributeError("'" + name + "' not an attribute of Point object.")
else:
super(Point, self).__setattr__(name, value)
Run Code Online (Sandbox Code Playgroud)
有没有办法避免手动覆盖__setattr__
()并在元类的帮助下自动执行此操作?
我最近的是 -
class attr_block_meta(type):
def __new__(meta, cname, bases, dctry):
def _setattr(self, name, value):
if not hasattr(self, name):
raise AttributeError("'" + name + "' not an attribute of " + cname + " object.") …
Run Code Online (Sandbox Code Playgroud) 我想在项目中仅在"Debug"构建配置下包含一个文件,而不是在"Release"构建中.我怎么能通过IDE做到这一点?
我已经能够通过手动编辑' *.vcxproj '文件来实现上述目的.
Run Code Online (Sandbox Code Playgroud)<ClCompile Include="..\..\..\..\dbg_helper.c" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"/>
我正在使用Microsoft Visual Studio Express 2013 for Windows Desktop(版本12.0.21005.1 REL).
我想要的是像 -
git checkout FHEAD~ path/filename
我目前所做的是通过以下方式找到该文件的先前版本 -
git log -1 --skip=1 path/filename
然后,
git checkout <previous-commit-hash> path/filename
有没有一种简单的方法可以验证给定字符是否具有特殊的正则表达式函数?
当然我可以在列表中收集正则表达式字符,比如['.', "[", "]", etc.]
检查一下,但我想有更优雅的方式.
我目前有一套测试,它们是测试夹具的一部分。我也想用不同的测试夹具运行相同的测试集。
如何在不实际复制粘贴测试和“手动”更改测试夹具名称的情况下执行此操作(如下所示)?
class Trivial_Test : public ::testing::Test
{
void SetUp()
{
ASSERT_TRUE(SUCCESS == init_logger());
initial_condition = 0;
}
void TearDown()
{
shutdown_logger();
}
protected:
int initial_condition;
};
class Trivial_Test_01 : public ::testing::Test
{
void SetUp()
{
ASSERT_TRUE(SUCCESS == init_logger());
initial_condition = 1;
}
void TearDown()
{
shutdown_logger();
}
protected:
int initial_condition;
};
TEST_F(Trivial_Test, valid_input_1)
{
EXPECT_TRUE(random_num()+initial_condition < 255);
}
TEST_F(Trivial_Test_01, valid_input_1)
{
EXPECT_TRUE(random_num()+initial_condition < 255);
}
Run Code Online (Sandbox Code Playgroud)
是否有关联的一个更简洁的方式valid_input_1
既Trivial_Test
和Trivial_Test_01
?
PS - 上面显示的测试用例是一个微不足道的测试,它名义上代表了我的实际情况,但远不及我实际处理的测试用例或测试夹具的复杂性。
我创建了以下宏来锁定互斥锁并返回(从调用此宏的函数),以防尝试锁定失败.目前我已经将它缩小到2个宏 - 一个用于从返回值的函数返回,不管类型如何,另一个用于从返回任何函数的函数返回(即void).
宏之外的代码(下面)仅用于说明,与使用宏的实际生产代码几乎没有关系.
#define MUTEX_LOCK()\
{\
if (pthread_mutex_lock(&mutex) != 0)\
{\
printf("Failed to lock mutex.\n");\
return;\
}\
}
#define MUTEX_LOCK_RVAL(err_val)\
{\
if (pthread_mutex_lock(&mutex) != 0)\
{\
printf("Failed to lock mutex.\n");\
return err_val;\
}\
}
void vfunc()
{
printf("\nIn vfunc()\n");
MUTEX_LOCK();
printf("\nOut of vfunc()\n");
}
UINT16 uint16func()
{
printf("\nIn uint16func()\n");
MUTEX_LOCK_RVAL(0);
printf("\nOut of uint16func()\n");
return 9;
}
CHAR* errstr = "Hoo boy!";
CHAR* strfunc()
{
printf("\nIn strfunc()\n");
MUTEX_LOCK_RVAL(errstr);
printf("\nOut of strfunc()\n");
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法将这些减少到一个宏,可以在返回值和void的函数中使用.
SleepConditionVariableCS的MSDN页面指出了这一点
条件变量受到虚假唤醒(那些与显式唤醒无关)和被盗唤醒(另一个线程设法在唤醒线程之前运行).因此,您应该在睡眠操作返回后重新检查谓词(通常在while循环中).
因此,条件等待必须包含在while循环中,即
while (check_predicate())
{
SleepConditionVariableCS(...)
}
Run Code Online (Sandbox Code Playgroud)
如果我使用事件而不是条件变量,我可以在等待时使用while循环(WaitForSingleObject)来发信号通知事件吗?
我正在寻找的是这样的 -
Set Breakpoint 1
Set Breakpoint 2
Disable Breakpoint 2
Set dbg_counter to 0
Increment dbg_counter everytime Breakpoint 1 is reached
If dbg_counter > 100:
Enable (once) Breakpoint 2
Set dbg_counter to 0
Run Code Online (Sandbox Code Playgroud)
请注意'dbg_counter'是一个只有调试器知道的变量(即不是被调试程序的一部分).
以下是我的测试夹具的精髓 -
SetUp()
{
g_listen_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
/* localhost is the server */
bind(g_listen_sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
listen(g_listen_sock, max_connections);
}
testcase()
{
hdl = accept(g_listen_sock, NULL, NULL);
-- send()/recv() data on the socket --
}
TearDown()
{
shutdown(g_listen_sock, SHUT_RDWR);
close(g_listen_sock);
g_listen_sock = INVALID_SOCKET;
}
Run Code Online (Sandbox Code Playgroud)
在应用程序的正常使用中,侦听套接字仅在应用程序的生命周期中绑定一次,但是测试设置会反复打开和关闭侦听套接字.测试用例的第一次迭代工作正常但后续迭代在使用errno == 98
ie EADDRINUSE 的bind()调用时失败.
我该如何避免这种情况?理想情况下,该解决方案不需要我具有单独的代码测试版本,例如在测试时使用SO_REUSEADDR.
PS - 相同的代码在Windows上正常工作,在Linux上发生bind()失败.
迭代迭代器时我想避开最终项目并停在倒数第二项 - 我该怎么做?
from itertools import product
from collections import namedtuple
param_list = []
Parameter = namedtuple("Parameter", ['bad', 'good'])
param1 = Parameter(["peanut", "gluten"], ["bacon", "pickle"])
param_list.append(param1)
param2 = Parameter([0], [1, 22])
param_list.append(param2)
param3 = Parameter([0, 1], [2, 3, 4, 9])
param_list.append(param3)
param4 = Parameter(["football"], ["running", "yoga"])
param_list.append(param4)
for prod in product(*param_list): # -- I want to skip the last product --
for sub_prod in product(*prod):
prod = [str(x) if type(x) is not str else x for x in sub_prod]
print …
Run Code Online (Sandbox Code Playgroud) 我需要一种仅在子字符串是整个单词时才搜索子字符串的方法。
\n\n理想情况下,我想要一个函数(比如说findwstring()
),这样两个例子,
\n $(findwstring a, a b c)
\n $(findwstring a, angle b c)
\n 应该生成值 \xe2\x80\x98a\xe2\x80\x99 和 \xe2\x80\x98\xe2\x80\x99 (空字符串)分别。
我找不到任何东西我在这里可以帮助我的东西。
\n