我想以这种方式对我的应用程序进行压力测试,因为它似乎在一些非常老的客户机中失败了.
起初我读了一些关于QEmu的内容并考虑了硬件仿真,但这似乎是一个很长的镜头.我在超级用户那里问过,但是还没有收到太多反馈.
所以我转向你们......你们这样的测试怎么样?
我已经阅读了大多数与SO相关的问题(这里,这里和那里).最后一个问题提出了四种替代方法来生成调用静态方法单元可测试的代码.我想问一下我的具体情况:我们有一个"业务逻辑层"或"规则"项目,它包含45个静态类(没有状态,只有静态方法).而且,它们不易自行测试:大多数都访问数据库和文件系统.无论如何,它并没有那么糟糕:要访问数据库,他们使用某些Mapper类的唯一实例(所有Mappers都是Singletons).每当我尝试对某些东西进行单元测试时,我都会碰到这堵墙.最大的问题是这是非常非常重要的代码,应该非常仔细地计划对其进行更改.我的问题:我应该如何使这个单元更加可测试?我应该编写45个接口并使用依赖注入吗?即便如此,我如何存根/模拟Mappers?
PS:我一直在阅读Michael Feathers的"使用传统代码",所以欢迎直接引用(其他书籍也是:)
编辑:由于有些人说解决方案可能依赖于平台,我正在研究.NET(C#和一些VB.NET)
我记得在NUnit Runner失败的旧版Team City中这样做,所以我尝试使用命令行运行器来运行NUnit.
我认为命令行运行器设置中有一个选项可以指定输出文件的类型:NUnit result.xml就是其中之一.这样做,您可以在Web GUI中看到测试结果细分,就像NUnit Runner工作时一样.
但我在最新的Team City(6.5.5)中没有看到这一点.它还能完成吗?
PS:在有人要求之前,我不能使用Team City的NUnit Runner,因为NUnit有一个bug,将在即将到来的2.6.0版本中修复.运行nunit-console时不会出现错误
我有一个在a boost::thread上执行同步读取boost::asio::serial_port.当我销毁包含两者的类的实例时,我希望线程优雅地结束,即使它在读取调用中被阻止.我怎样才能做到这一点?
看看文档,我尝试过cancel,但它只适用于异步读/写.然后我尝试了close,但是我得到了一个例外,它不是你可以恢复的那种.也许用send_break或native_handle?(这是Windows和便携性并不重要)
更新:我也试图stop在io_service传递到串口对象的构造我,但read并不畅通.
编辑:异常实际上是"可捕获的",但我不想在析构函数中放置一个try/catch块,并且重构代码以在析构函数之外执行关闭过程会在上层触发大量更改.因此,如果一些Boost权威人士说没有别的办法,我只会选择这个解决方案.
我最近注意到我需要在许多项目中重用构建步骤.所以我创建了一个模板,我只定义了构建步骤,并且需要它的项目与该模板相关联.这非常有效.
但后来我意识到,没有一个受影响的项目正在生成他们的工件,即使它们都是成功构建的.当我去查看"常规设置"时,"工件路径"框显示为灰色,Team City告诉我,我只能在模板中更改它!
我希望我的构建具有不同的工件路径(有些甚至根本不生成工件),但我不想复制构建步骤.这有什么解决方法吗?
团队城市版本:6.5.6(build 18130)
我有一个复杂的问题,我想知道现有的,易于理解的解决方案模型是否存在或适用,例如旅行商问题.
输入:
(Ai,Aj),表示服务员Ai希望与出席者见面Aj,并Aj接受该邀请.输出:
A,他将参加的所有活动的计时码表.主要标准是每位服务员应尽可能多地接待接受邀请的服务员,以满足空间限制.到目前为止,我们考虑使用回溯求解(尝试所有可能的解决方案),并使用线性编程(即定义模型并使用单纯形算法求解)
更新:如果在某些情况下Ai已经满足Aj,他们不再需要见面(他们已经见过面).
language-agnostic algorithm mathematical-optimization linear-programming
我查看了一些这里提到的性能分析器.但...
(我花了整整一天难过这个,抱歉,如果我太消极了)
更新:在我清理了我的解决方案之后,再次构建它并检查所有调试信息(.pdb)被复制到与可执行文件相同的目录,我再次尝试了AQTime并且它工作了!它向我展示了托管代码和非托管代码的常规时序信息,因此我的问题得以解决.但是,我正在使用一个付费的分析器,所以这个问题将保持开放,直到我看一看xperf或有人想出其他的东西
如果我们完全启动Windows,然后启动它,我们的Direct3D9应用程序将完美运行.但是,如果我们调整Windows的启动过程以便不运行资源管理器,并且只启动Windows和我们的应用程序,那么我们的应用程序可能会慢下来.即使空闲(通常,它接近0),CPU消耗也会达到50%.
这可以通过启动任务管理器,启动资源管理器并重新启动我们的应用程序来解决.但这是不可接受的; 我们的应用必须在没有Explorer的情
这可能是Direct3D吗?我们的应用程序是全屏,Windows版本是XP SP3,包含所有最新更新,Direct3D版本是9.0.c. 如果这不是与Direct3D相关的,我该如何调试呢?
我写了/支持一个名为uCon的终端模拟器(http://www.umonfw.com/ucon).它全部基于"good-ole"Win32,完全是'C'.我最近被要求支持将uCon连接到COM端口并为RS232流量控制之外的目的设置DTR/RTS的能力.我知道在使用EscapeCommFunction()和/或SetCommState()调用CreateFile()之后我可以这样做; 但是,这些函数只能被调用AFTER CreateFile()返回打开端口的句柄.不幸的是,当CreateFile()打开端口时,它将DTR/RTS设置为默认状态,这可能(或可能不)与我希望保留DTR的状态不同.
例如,假设用户的板连接到PC的串行端口,DTR线用于将板放置在某种非标准状态.在DTR无效的情况下,电路板运行"正常",但偶尔使用DTR激活将硬件转换到其他状态.
在大多数情况下,我看到,CreateFile()使DTR处于活动状态,然后我对清除DTR的调用将其恢复为非活动状态; 然而,这是一个我需要避免的故障.我发现了一个名为GetDefaultCommConfig()和SetDefaultCommConfig()的函数集,但是无法使它们成功运行.所以,我的问题是......
有没有办法预先定义在调用CreateFile()时将在RS232控制线上建立的默认状态?有没有人成功使用过GetDefaultCommConfig()/ SetDefaultCommConfig()?
在我看来,这应该允许我预先建立在调用CreateFile()时使用的DTR的值...
int
EstablishDefaultDTR(char *comPortName, int dtr)
{
COMMCONFIG cc;
DWORD bsize = sizeof(COMMCONFIG);
if (GetDefaultCommConfig(comPortName,&cc,&bsize) == 0) {
ShowLastError("GetDefaultCommConfig()");
return(-1);
}
if (dtr)
cc.dcb.fDtrControl = DTR_CONTROL_ENABLE ;
else
cc.dcb.fDtrControl = DTR_CONTROL_DISABLE ;
if (SetDefaultCommConfig(comPortName,&cc,bsize) == 0) {
ShowLastError("SetDefaultCommConfig()");
return(-1);
}
}
但是,正如您可能已经猜到的那样,事实并非如此.有任何想法吗?
我的程序在我可以重现的小场景中随机崩溃,但它发生在来自ntdll.dll的mlock.c(这是一个VC++运行时文件)中,我看不到堆栈跟踪.我知道它发生在我的一个线程函数中.
这是程序崩溃的mlock.c代码:
void __cdecl _unlock (
int locknum
)
{
/*
* leave the critical section.
*/
LeaveCriticalSection( _locktable[locknum].lock );
}
Run Code Online (Sandbox Code Playgroud)
错误是"指定的句柄无效".如果我看一下locknum,它的数量大于_locktable的大小,所以这是有道理的.
这似乎与关键部分的使用有关.我在我的线程中使用CRITICAL_SECTIONS,通过CCriticalSection包装器类及其相关的RAII保护器CGuard.两个定义在这里,以避免更多的混乱.
这是崩溃的线程函数:
unsigned int __stdcall CPlayBack::timerThread( void * pParams ) {
#ifdef _DEBUG
DRA::CommonCpp::SetThreadName( -1, "CPlayBack::timerThread" );
#endif
CPlayBack * pThis = static_cast<CPlayBack*>( pParams );
bool bContinue = true;
while( bContinue ) {
float m_fActualFrameRate = pThis->m_fFrameRate * pThis->m_fFrameRateMultiplier;
if( m_fActualFrameRate != 0 && pThis->m_bIsPlaying ) {
bContinue = ( ::WaitForSingleObject( pThis->m_hEndThreadEvent, static_cast<DWORD>( 1000.0f / m_fActualFrameRate …Run Code Online (Sandbox Code Playgroud) c++ ×4
windows ×3
serial-port ×2
teamcity ×2
.net ×1
.net-4.0 ×1
algorithm ×1
artifacts ×1
boost ×1
boost-asio ×1
c ×1
command-line ×1
cpu-speed ×1
direct3d9 ×1
kiosk ×1
low-memory ×1
mixed ×1
nunit ×1
performance ×1
profiler ×1
refactoring ×1
simulation ×1
templates ×1
unit-testing ×1
visual-c++ ×1
windows-xp ×1