我不是100%确定这是足够的问题,但我想是的 属于" a specific programming problem"。制作它的提示 欢迎更多的SO友好。
上下文
在DLang中,线程之间没有默认的数据共享 - 而是使用消息传递。由于这种方法安全而干净,因此很难扩展我们的代码范围。最好的例子是多个作者 - 多个读者问题 - 使用std.concurrency
时会变得非常复杂。
解决这个问题的常用方法是使用内存中的队列 - 编写器推送到该队列,读者从中拉出,每个线程按自己的节奏运行,Bob是你的叔叔。所以,我决定自己为DLang实施Queue。
代码
队列有以下API:
module javaesque.concurrency;
Queue!T queue(T)(){
// constructor, out of struct itself for implementation sake
}
struct Queue(T){
// internals not important for the sake of question
void push(T val){
// ...
}
T pull(){
// ...
}
}
这是一个使用它的示例应用程序:
// import whatever's needed, stdio, concurrency, etc
void runnable(Queue!string q){
try {
while (true) {
writeln(to!string(thisTid)~" "~q.pull());
}
} catch (OwnerTerminated ot) {
}
}
void main(string[] args){
Queue!string queue = queue!string();
spawn(&runnable, queue);
spawn(&runnable, queue);
for (int i = 0; i< 20; ++i){
queue.push(to!string(i));
}
readln();
}
问题
好的,我该如何测试呢?虽然原型设计我只是通过运行该示例应用程序来测试它,但现在我已经确认该想法本身可以按预期工作,我想编写一些单元测试。但是如何?
请注意,我没有为此添加
dlang
或相关标签 题。尽管我已经在DLang中提供了片段 背景是高度D相关的,我正在寻找一般帮助 测试这种结构,而不是限制自己 语言。显然,DLang特定添加的一般答案是 欢迎,但问题本身应该被视为 语言无关。
答案 0 :(得分:0)
嗯,“通用”测试方法有两个方面:
除此之外:您显然首先以单线程方式测试整个构造。您还可以查看与same thread服务类似的内容:您将环境设置为有效仅使用一个线程。
这对于“大多数”代码来说可能就足够了 - 那么你可能会对一些实际测试一个预期的端到端场景(使用多个线程)的“集成”测试很好。在那里,你可以测试一下,你的多个读者最终会得到一些预期的结果。
最后,从另一个角度来看: key 到良好的单元测试是编写可以轻松进行单元测试的代码。您需要能够独立地查看不同的单元。但是如果你在这里提供那些代码,那么宁愿变成代码查看请求(这不属于这里)。