3 回答
TA贡献1784条经验 获得超7个赞
TA贡献2039条经验 获得超7个赞
这个问题发布的时候已经有一段时间了,但还是没有答案.
有一种方法,我练习C#代码。对于单元测试,您应该能够编程。可复制测试,这是多线程代码中最大的挑战。因此,我的答案是将异步代码强制放入测试工具中,这是可行的。同步.
这是Gerard Meszardos的书中的一个想法“xUnit测试模式并且被称为“谦卑对象”(第695页):您必须分离核心逻辑代码和任何闻起来像异步代码的代码。
这使您可以在同步方式,道路。您对在核心逻辑上执行的呼叫的时间有绝对的控制,因此可以进行可复制测试。这是分离核心逻辑和异步逻辑的好处。
这个核心逻辑需要由另一个类包装,它负责异步地接收对核心逻辑的调用。代表们这些对核心逻辑的调用。生产代码只能通过该类访问核心逻辑。因为这个类只应该委托调用,所以它是一个非常“愚蠢”的类,没有太多的逻辑。因此,您可以将这个异步工作类的单元测试保持在最低限度。
以上的任何东西(测试类之间的交互)都是组件测试。同样在这种情况下,如果你坚持“谦逊对象”模式,你应该能够对时间有绝对的控制。
TA贡献1852条经验 获得超7个赞
真厉害!在我的(C+)单元测试中,我按照所使用的并发模式将其分解为几个类别:
对于在单个线程中操作的类的单元测试,而不是线程感知的类-简单,像往常一样进行测试。
单元测试监视对象(那些在调用者的控制线程中执行同步方法的方法),这些方法公开了同步的公共API-实例化了执行API的多个模拟线程。构造执行被动对象内部条件的方案。包括一个更长时间运行的测试,它可以在很长一段时间内从多个线程中摆脱出来。这是不科学的,我知道,但它确实建立了信心。
单元测试活动对象(封装自己的线程或控制线程的线程)-类似于上面的#2,根据类设计的不同而有所变化。公共API可能阻塞或非阻塞,呼叫者可能获得期货,数据可能到达队列或需要去排队。这里有很多种组合;白色的盒子离开了。仍然需要多个模拟线程来调用被测试对象。
作为旁白:
在我所做的内部开发人员培训中,我教并发支柱这两种模式作为思考和分解并发问题的主要框架。显然还有更高级的概念存在,但我发现这套基础知识可以帮助工程师远离困境。它还导致代码更易于测试,如上文所述。
添加回答
举报