今天碰到一个单元测试中的 bug,有点意思,不妨记录如下。
我有一个 Azure CloudTable,用来存放一些需要后台执行的操作内容。其
PartitionKey 和 RowKey 分别设为订阅号和当时的时钟滴答(Tick)。这样设计的用意在于,尽量使得针对某个订阅和,基于时间的查询将会很快。但也有一个隐含的假设:在一个Tick之内只会有一个操作需要被记录
。这应该是一个合理的假设,因为操作是由前台Web页面提交的。
var tick = DateTime.UtcNow.Ticks;
我在单元测试中循环添加了一系列记录(显然,不是通过网页),插入记录时发生了冲突 - 因为 PK + RK 不能唯一识别一条记录,因为 DateTime 本身远非精确到每个Tick。
long now = DateTime.Now.Ticks;
long cur;
long cnt = 1;
while ((cur = DateTime.Now.Ticks) == now)
{
++cnt;
}
Console.WriteLine("delta: {0}, cnt: {1}", cur - now, cnt);
我的机器上,cnt
大致处于一万至十万之间。