Как я могу эффективно протестировать (единица/интеграция) параллельный код в Java?

sorted(filter(os.path.isfile, os.listdir('.')), 
    key=lambda p: os.stat(p).st_mtime)

Вы могли использовать os.walk('.').next()[-1] вместо того, чтобы фильтровать с os.path.isfile, но это оставляет мертвые символьные ссылки в списке, и os.stat перестанет работать на них.

18
задан Community 23 May 2017 в 12:26
поделиться

6 ответов

Я думаю, что это сложно по своей сути, поскольку вы хотите доказать отсутствие что-то в (возможно) недетерминантной системе. При этом всегда стоит писать повторяющиеся тесты, чтобы нагружать ваши многопоточные компоненты. Если возникает проблема, возможно, вы не сможете ее повторить, но, возможно, вы сможете найти ошибку путем осмотра. Поэтому убедитесь, что ваши тесты очень подробно регистрируют соответствующие исключения (и, возможно, входные параметры и т. Д.)

Также стоит запустить статический анализатор кода. Они выявят (среди прочего) несогласованную синхронизацию переменных и сразу же выделят области, вызывающие беспокойство. FindBugs является одним из таких инструментов.

9
ответ дан 30 November 2019 в 09:25
поделиться

I've typically spawned a huge number (like 100) threads in a unit test and sent them off against it in hopes of hitting a race condition :). Sadly, that's not very definitive. You can improve your odds though by having debug lines in your thread sensitive areas that cause the active thread to sleep for X millis. This strategy allows you to leaving gaping windows where other threads can interleave. These lines would only be active during unit testing (use aspects or hard code lines that only activate when a debug flag is set).

Proving a negative is hard to impossible. You can't really prove you don't have a concurrency issue. All you can do is set up your tests to exercise it as thoroughly as possible.

3
ответ дан 30 November 2019 в 09:25
поделиться

One good way to test this is to make sure you have access to a multi-cpu machine, then run your test for as long a time/with as many iterations as possible. For example if you have a multithreaded producer consumer algorithm, fill the queue with a good sized list and use 2x as many threads as you might in production. This should at least give you a chance of hitting a race condition or synchronization issue more commonly. Then run this test in a daily build.

0
ответ дан 30 November 2019 в 09:25
поделиться

I suggest you get Java Concurrency in Practice -- not only does it tell you how to avoid race conditions in the first place, there is a section on testing concurrency.

Also there are static analysis tools for concurrency available for Java -- unfortunately while I know they are out there, I have not been in a position to evaluate them.

2
ответ дан 30 November 2019 в 09:25
поделиться

Код, который может дать сбой из-за недетерминированных проблем потоковой передачи, не должен тестироваться. Вместо этого его следует удалить и заменить чем-то, что может быть.

В большинстве случаев это можно сделать, просто сделав все однопоточным - лишь небольшая часть приложений нуждается в небольшом повышении масштабируемости, которое в процессе предварительного -эмпирическое планирование обеспечивает. В качестве альтернативы вы можете настроить многопоточную архитектуру, в которой используется ОС, компилятор или сторонний инструмент, чтобы обеспечить жесткую гарантию невозможности выполнения недетерминированных операций.

-1
ответ дан 30 November 2019 в 09:25
поделиться

Я отвечу на это, чтобы избежать создания ситуаций, в которых могут возникнуть условия гонки, при разумном использовании разумного дизайна и существующих технологий. Например, если ваше приложение MT использует автономные рабочие элементы, вы можете встроить брокер JMS в свое приложение, чтобы использовать его в качестве механизма связи между потоками. Точно так же с системными ресурсами, которые могут быть подвержены условиям гонки, не делайте эти части многопоточными. Если у вас есть файлы, которые вам нужно написать, сделайте один поток ответственным за их запись с использованием информации, передаваемой через подсистему JMS.

В конечном счете, нет никакого способа модульного тестирования MT-кода, чтобы убедиться, что он не уязвим для состояния гонки.

0
ответ дан 30 November 2019 в 09:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: