我有一个正在测试的对象,它对数据访问对象进行了相当复杂的调用.它看起来像
object.DoSomething(somestring,someObject,someOtherObject,someOtherOtherObject)
在我的测试结构中,我有一个模拟版本的对象,我想测试Dosomething被调用somestring =="value1"和someObject.porpertyA =="value2".
我不能使用简单的AssertWasCalled()重载,因为我不知道(或关心)someOtherObject.我注意到另一个重载需要一个设置约束的动作,但我从未见过它.
我有一些不同的接口实现,以及我想要测试它们的各种因素.最终目标是在不同情况下为不同的实现制作结果网格.
我可以为每种可能的组合编写测试,但这会让人筋疲力尽:
func Benchmark_ImplA_N100_X300(b *testing.B){
impl := newImplA(100,300)
runBenchmark(b,impl)
}
Run Code Online (Sandbox Code Playgroud)
我添加的组合越多,我就越需要复制/粘贴.这很快就会变得很麻烦.
我很乐意做以下事情:
tests := []testing.InternalBenchmark{}
for _, n := range []int{50,100,500,10000}{
for _,x := range []int{300,200}{
for name, gen := range implementations{
impl = gen(n,x)
bm := testing.InternalBenchmark{Name: fmt.Sprint(name,x,n)}
bm.F = func(b *testing.B){
runBench(b,impl)
}
tests = append(tests,bm)
}
}
}
testing.RunBenchmarks(anything, tests)
Run Code Online (Sandbox Code Playgroud)
这样我就可以更新组合列表,并且基准测试将在所有组合中神奇地运行.我在main和TestMain中尝试了类似的东西,没有任何输出.我不确定我是否使用它错误,或者测试包是否正在做一些有趣的事情.
我真的不在乎go test工具是否可以处理它或是否有其他方式.
我试图找到一种方法来存储来自pprof的堆数据,以便我可以共享它,稍后查看,附加到问题等等。到目前为止,我的尝试没有奏效。
如果我跑步
go tool pprof http://my-server/debug/pprof/heap然后运行web,我得到了我期望的完整图表。但是,如果我下载文件:
wget -O heapDump http://my-server/debug/pprof/heap
尝试一下go tool pprof heapDump,似乎它无法完成所需的一切。我只得到一个非常有限的图:
我尝试添加?debug=1和使用不同的值,但是它们似乎都无法正常工作。
我正在研究一些脚本来测试各个级别的基础设施.我正在尝试进行测试以验证有和没有http2的客户端的功能.文档指定如何通过覆盖禁用 http2 Transport.TLSNextProto,但我找不到任何方法来要求 http2.
有没有办法要求http请求只使用http/2?或者,如果没有任何类型的字段或钩子,看它是否使用http2?
我有一个程序,它使用缓冲池来减少代码中性能敏感部分的分配.
像这样:播放链接
// some file or any data source
var r io.Reader = bytes.NewReader([]byte{1,2,3})
// initialize slice to max expected capacity
dat := make([]byte, 20)
// read some data into it. Trim to length.
n, err := r.Read(dat)
handle(err)
dat = dat[:n]
// now I want to reuse it:
for len(dat) < cap(dat) {
dat = append(dat, 0)
}
log.Println(len(dat))
// add it to free list for reuse later
// bufferPool.Put(dat)
Run Code Online (Sandbox Code Playgroud)
我总是分配固定长度的切片,保证大于所需的最大尺寸.我需要将大小减小到实际数据长度以使用缓冲区,但我还需要它再次作为最大大小,以便在下次需要时读入它.
我知道扩展切片的唯一方法是append,所以这就是我正在使用的.虽然这个循环感觉非常脏.而且可能效率低下.我的基准测试显示它并不可怕,但我觉得必须有更好的方法.
我只知道切片的内部表示,但如果我只能以某种方式覆盖长度值而不实际添加数据,那将是非常好的.我真的不需要把它归零或任何东西.
有没有更好的方法来实现这一目标?
我爱上了更新数据库模式的rails风格.我可以将迁移定义为具有相当简单但强大的语法的类.我可以使用单个命令运行更新,并且所有模型都会更新.他们致力于源代码控制,可以轻松阅读,修改和撤消.
我目前为我的asp.net mvc项目做的方法是打开服务器资源管理器,手动更改数据库字段,然后重新生成所有linq-to-sql类.该方法麻烦,容易出错,并且缺乏上面列出的几乎所有优点.我相当肯定必须有更好的方法.
任何人都可以开导我吗?
可能的重复:
在 C++ 中将字符串转换为日期
我有一个标准化格式 (RFC 1123) 的日期/时间字符串,我想将其转换为 unix 时间戳以与另一个日期/时间进行比较。
我可以通过使用 strftime 和魔术格式字符串将时间戳转换为字符串
"%a,%d %b %Y %H:%M:%S GMT"
Run Code Online (Sandbox Code Playgroud)
问题是,我需要做相反的事情,并将格式化的字符串转回时间戳。做这个的最好方式是什么?
我正在按照ayende在这篇文章中描述的犀牛嘲笑中的预期.我的代码看起来像这样:
using (_mocks.Ordered())
{
Expect.Call(() => _myMock.CallA());
Expect.Call(() => _myMock.CallB(40));
Expect.Call(() => _myMock.CallA());
}
_mocks.ReplayAll();
_myObjectUnderTest.DoStuff();
_mocks.VerifyAll();
Run Code Online (Sandbox Code Playgroud)
在此之后,我想添加更多期望并测试更多我的对象的方法.我想这样做是因为我有一些基本的测试方法可以对我的测试对象进行一些设置,而且我不想重新测试那个功能,所以我只是调用早期的测试方法.如果我在VerifyAll()之后尝试添加更多期望,我会得到一个异常:"当模拟对象处于验证状态时,此操作无效."
我的部分问题是我并不真正理解所有重放/验证内容的作用,我只是复制了代码.我正在使用严格的模拟,因此任何设置代码必须具有匹配的期望或失败.我不想复制我的设置代码的期望.
有没有办法重置模拟以某种方式准备重新开始?
我正在开发一个开源JavaScript应用程序,我正在尝试与第三方API(特别是github)进行交互.我试图只保留我的整个应用程序客户端,所以我真的不会有服务器回退或存储隐藏的文件.作为OAuth流程的一部分,我需要提供为我的api密钥提供的密钥.我不应该发布或分享这个密钥.
我想出了以下解决方案:
我基本上存储了一个秘密密钥的转换版本.我猜这一切都是因为我必须从用户那里获取密码而不是完整密钥.它应该比随机字节更容易记住.
这足够安全吗?它不是一个超级关键的应用程序,但我想尽我所能来保护我被告知不要分享的东西.是否有比3DES更好的方式以可逆的方式加密密钥?
我开始使用ninject拦截器来处理我的一些异步代码以及各种行为,并且在使一切正常工作时遇到一些麻烦.
这是我正在使用的拦截器:
public class MyInterceptor : IInterceptor
{
public async void Intercept(IInvocation invocation)
{
try
{
invocation.Proceed();
//check that method indeed returns Task
await (Task) invocation.ReturnValue;
RecordSuccess();
}
catch (Exception)
{
RecordError();
invocation.ReturnValue = _defaultValue;
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
在大多数正常情况下,这似乎可以正常运行.我不确定这是否符合我的预期.虽然它似乎异步地将控制流返回给调用者,但我仍然有点担心代理无意中阻塞某个线程或其他东西.
除此之外,我无法让异常处理工作.对于此测试用例:
[Test]
public void ExceptionThrown()
{
try
{
var interceptor = new MyInterceptor(DefaultValue);
var invocation = new Mock<IInvocation>();
invocation.Setup(x => x.Proceed()).Throws<InvalidOperationException>();
interceptor.Intercept(invocation.Object);
}
catch (Exception e)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在拦截器中看到catch块被击中,但我的测试中的catch块从未被重新抛出.我更困惑,因为这里没有代理或任何东西,只是非常简单的模拟和对象.我也尝试了类似于Task.Run(() => interceptor.Intercept(invocation.Object)).Wait();我的测试,但仍然没有变化.测试通过愉快,但nUnit输出确实有异常消息.
我想我搞砸了一些东西,而且我不太清楚我认为发生了什么.是否有更好的方法来拦截异步方法?关于异常处理,我做错了什么?
go ×4
c# ×3
rhino-mocks ×2
api ×1
asp.net-mvc ×1
async-await ×1
benchmarking ×1
c++ ×1
database ×1
encryption ×1
javascript ×1
migration ×1
ninject ×1
pprof ×1
security ×1
slice ×1
testing ×1
timestamp ×1
unit-testing ×1