如何测试跨线程队列?

时间:2017-09-11 07:35:23

标签: multithreading unit-testing testing blockingqueue

  

我不是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特定添加的一般答案是   欢迎,但问题本身应该被视为   语言无关。

1 个答案:

答案 0 :(得分:0)

嗯,“通用”测试方法有两个方面:

  • 您专注于您的构造的公共合同,并考虑测试该合同的每个方面的测试用例
  • 您专注于内部实现并考虑(附加)测试用例以使您进入特定的角落案例

除此之外:您显然首先以单线程方式测试整个构造。您还可以查看与same thread服务类似的内容:您将环境设置为有效仅使用一个线程。

这对于“大多数”代码来说可能就足够了 - 那么你可能会对一些实际测试一个预期的端到端场景(使用多个线程)的“集成”测试很好。在那里,你可以测试一下,你的多个读者最终会得到一些预期的结果。

最后,从另一个角度来看: key 到良好的单元测试是编写可以轻松进行单元测试的代码。您需要能够独立地查看不同的单元。但是如果你在这里提供那些代码,那么宁愿变成代码查看请求(这不属于这里)。