在标题中,我想测试这样的方法:
public void startThread()
{
new Thread()
{
public void run()
{
myLongProcess();
}
}.start();
}
Run Code Online (Sandbox Code Playgroud)
编辑:通过评论判断我认为测试线程是否启动并不常见.所以我要调整问题......如果我的要求是100%的代码覆盖率,我是否需要测试该线程是否启动?如果是这样,我真的需要一个外部框架吗?
是否可以"单元测试"一个简单的类是否是线程安全的?
我的具体情况是一个简单的类,即子集向量:给定要保持的向量位置的"白名单"和输入向量,它产生一个输出向量,其中只有白名单中位置的值.我想写一个单元测试(如果可能的话)以确保如果我们将来重构这个类,我们保持它的线程安全.如果类不再是线程安全的,单元测试将失败.我意识到这有点模糊,并且在定义之下.
是否有任何测试多线程代码的指导原则(除了在问题上抛出一堆线程并交叉手指).
我基本上正在寻找测试数据损坏,死锁和其他并发问题的好方法.基本上我希望能够通过测试证明代码是线程安全的.
Java中是否有任何框架可以让您轻松编写多线程场景的测试?
我是使用单元测试模块进行单元测试的新手,我需要测试一个使用线程模块的类。我并没有真正找到关于使用线程组合类的最佳方法的任何解决方案。我开始测试线程是否被调用(即活着),但后来我看到没有方法可以杀死线程。我需要一周的时间来确保线程中的代码在做它应该做的事情。我需要为此使用线程还是应该只测试函数本身?
谢谢你的帮助!
这是我的代码(有趣的部分):
class VideoLoader(Node):
# some code
def execute(self):
self.thread1 = Thread(target = run_resizer, args = (self,))
def run_resizer(node):
while True:
while not len(node.frames_to_resize):
time.sleep(0.001)
node.frames.append(resize({'height': 400, 'width': 500))
Run Code Online (Sandbox Code Playgroud) 在编写一些java文章时,我试图在多线程环境中的非同步对象构造的情况下重现重新排序.构建重型对象时没有同步/挥发性/韵母和其他线程在构造函数调用后立即访问它的情况.这是我尝试的代码:
public class ReorderingTest {
static SomeObject<JPanel>[] sharedArray = new SomeObject[100];
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
String name = "watcher" + i;
new Thread(new Watcher(name)).start();
System.out.printf("watcher %s started!%n", name);
}
}
static class Watcher implements Runnable {
private String name;
Watcher(String name) {
this.name = name;
}
public void run() {
while (true) {
int randomIndex = (int) (Math.random() * sharedArray.length);
SomeObject<JPanel> item = sharedArray[randomIndex];
if (item …Run Code Online (Sandbox Code Playgroud) 我正在开发一些最终将使用线程池进行多线程的代码Executor。线程池执行的任务将进行回调并(有时)将进一步的任务提交到任务队列。我想首先开发单线程代码,使其正确(我正在使用测试驱动开发),然后才进行更改以确保线程安全(锁等)。为此,我需要一个Executor可以安全地与非线程安全代码一起使用的代码。
我认为这意味着我需要一个Executor单线程的。也就是说,它导致所有工作都由调用线程完成。JRE 提供这样的吗Executor?或者是否可以将其中一个Executor配置为在该模式下运行?
我已经在使用Humble Object测试模式来测试我的大部分单线程代码。然而,我的一些代码必须与 anExecutor或可能与 an交互ExecutorService,因为它涉及任务的 调度和重新提交,并且它将以一种不平凡的方式进行。测试该代码是这里的挑战。这些任务更新一个共享对象,该对象保存其结果和输入数据。我想推迟使该共享对象线程安全,直到我实现并调试了调度和重新提交代码。
我正在delayed_job为DataMapper 编写一个克隆.除了工作进程中的线程之外,我已经得到了我认为正在工作和测试的代码.我查找delayed_job了如何测试这个,但现在有对该部分代码的测试.下面是我需要测试的代码.想法?(我正在使用rspec BTW)
def start
say "*** Starting job worker #{@name}"
t = Thread.new do
loop do
delay = Update.work_off(self) #this method well tested
break if $exit
sleep delay
break if $exit
end
clear_locks
end
trap('TERM') { terminate_with t }
trap('INT') { terminate_with t }
trap('USR1') do
say "Wakeup Signal Caught"
t.run
end
Run Code Online (Sandbox Code Playgroud)
另见这个帖子
我需要一个具有以下要求的简单数据结构:
我对多线程的经验非常有限,但这就是我的目标:
public class Tickets
{
private ConcurrentQueue<uint> _tickets;
public Tickets(uint from, uint to)
{
Initialize(from, to);
}
private readonly object _lock = new object();
public void Initialize(uint from, uint to)
{
lock(_lock)
{
_tickets = new ConcurrentQueue<uint>();
for (uint i = from; i <= to; i++)
{
_tickets.Enqueue(i);
}
}
}
public uint Dequeue()
{
uint number;
if (_tickets.TryDequeue(out number))
{
return number;
}
throw new ArgumentException("Ticket queue empty!");
}
}
Run Code Online (Sandbox Code Playgroud)
第一个问题:这段代码好吗?
Secod问题:我怎样才能对这个类进行单元测试(例如,两个线程在队列中定期执行出队操作,元素为(1,2,3,4,5,6),第一个线程只能得到奇数和第二个线程只有偶数)?我试过这个,但断言没有执行:
[Test]
public void Test() …Run Code Online (Sandbox Code Playgroud) 我必须使用锁作为我课程工作的一部分来实现自定义障碍类.为了测试我的LockBarrier课程,我提出了以下测试代码.它工作正常,但我担心这是否是正确的方法.你能否提出我可以做的改进,特别是构建课程.我认为我的编码方式不正确.欢迎任何建议.
public class TestDriver
{
private static LockBarrier barrier;
static class Runnable1 implements Runnable
{
public Runnable1()
{ }
public void run()
{
try
{
System.out.println(Thread.currentThread().getId()+" lazy arrived at barrier");
Thread.sleep(10000);
barrier.await();
System.out.println(Thread.currentThread().getId()+" passed barrier");
}
catch (InterruptedException ie)
{
System.out.println(ie);
}
}
}
static class Runnable2 implements Runnable
{
public Runnable2()
{ }
public void run()
{
try
{
System.out.println(Thread.currentThread().getId()+" quick arrived at barrier");
//barrier.await(1,TimeUnit.SECONDS);
barrier.await();
System.out.println(Thread.currentThread().getId()+" passed barrier");
}
catch (InterruptedException ie)
{
System.out.println(ie);
}
} …Run Code Online (Sandbox Code Playgroud) 我正在测试一个线程安全类.我从不同的线程调用它的方法,以确保它们都收到相同的结果(简而言之).这是我决定使用多少线程的方式:
int threads = Runtime.getRuntime().availableProcessors() * 4;
Run Code Online (Sandbox Code Playgroud)
这是一个好习惯吗?我应该使用多少?越多越好?
我一直试图解决这个问题很长一段时间了.我已经编写了一些示例代码,展示了lockC#中的用法.手动运行我的代码我可以看到它的工作方式应该如此,但当然我想写一个单元测试来确认我的代码.
我有以下ObjectStack.cs课程:
enum ExitCode
{
Success = 0,
Error = 1
}
public class ObjectStack
{
private readonly Stack<Object> _objects = new Stack<object>();
private readonly Object _lockObject = new Object();
private const int NumOfPopIterations = 1000;
public ObjectStack(IEnumerable<object> objects)
{
foreach (var anObject in objects) {
Push(anObject);
}
}
public void Push(object anObject)
{
_objects.Push(anObject);
}
public void Pop()
{
_objects.Pop();
}
public void ThreadSafeMultiPop()
{
for (var i = 0; i < NumOfPopIterations; i++) { …Run Code Online (Sandbox Code Playgroud) 我想测试一个修复,其中SimpleDateFormat用作静态类变量.我得到了
以前我的代码是
public class Abc{
private static SimpleDateFormat dateformatter;
public static String method1(final Calendar calendar) {
String thePattern = "ddMMM";
dateformatter = new SimpleDateFormat(thePattern, Locale.US);
sPars = dateformatter.format(calendar.getTime());
//Something
}
public static String method2(final Calendar calendar) {
String thePattern = "ddMMyyyy";
dateformatter = new SimpleDateFormat(thePattern, Locale.US);
sPars = dateformatter.format(calendar.getTime());
//Something
}
}
Run Code Online (Sandbox Code Playgroud)
对于这个,我得到了以下异常
java.lang.ArrayIndexOutOfBoundsException: 965
at sun.util.calendar.BaseCalendar.getCalendarDateFromFixedDate(BaseCalendar.java:454)
at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2333)
at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2248)
at java.util.Calendar.setTimeInMillis(Calendar.java:1140)
at java.util.Calendar.setTime(Calendar.java:1106)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:955)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:948)
at java.text.DateFormat.format(DateFormat.java:336)
Run Code Online (Sandbox Code Playgroud)
现在我已将其更改为:
public class Abc{
public static String method1(final Calendar …Run Code Online (Sandbox Code Playgroud) 我有一个启动线程并运行一些后台任务的服务类。在运行单元测试时,不应运行这些任务。服务类本身非常简单,因此不需要进行单元测试。它就像是:
@Service
public class BackgroundTaskService {
@PostConstruct
public void startTask() {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
当前,我正在设置系统属性以声明正在运行单元测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SomeTest {
static {
System.setProperty("unit_testing", "true");
}
@Test
public void test() {}
}
Run Code Online (Sandbox Code Playgroud)
然后,我可以检查:
@PostConstruct
public void startTask() {
if (System.getProperty("unit_testing") != null) {
return; // skip background tasks
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法可以做到这一点。
multithreading ×12
java ×9
unit-testing ×9
c# ×2
concurrency ×2
testing ×2
.net ×1
executor ×1
junit ×1
python ×1
queue ×1
rspec ×1
ruby ×1
spring ×1