मेरा दृष्टिकोण यहां है। यह परीक्षण डेडलॉक्स से चिंतित नहीं है, यह स्थिरता से चिंतित है। मैं एक तुल्यकालन ब्लॉक के साथ एक विधि का परीक्षण कर रहा हूँ, कोड है कि कुछ इस तरह दिखता साथ:
synchronized(this) {
int size = myList.size();
// do something that needs "size" to be correct,
// but which will change the size at the end.
...
}
यह एक परिदृश्य है कि मज़बूती से एक धागा संघर्ष का उत्पादन करेगा निर्माण करने के लिए कठिन है, लेकिन यहाँ मैं क्या किया है।
सबसे पहले, मेरे यूनिट परीक्षण ने 50 धागे बनाए, उन्हें एक ही समय में लॉन्च किया, और उन सभी ने मेरी विधि को कॉल किया। मैं उन सभी को एक ही समय में शुरू करने के लिए के लिए उलटी गिनती कुंडी का उपयोग करें:
CountDownLatch latch = new CountDownLatch(1);
for (int i=0; i<50; ++i) {
Runnable runner = new Runnable() {
latch.await(); // actually, surround this with try/catch InterruptedException
testMethod();
}
new Thread(runner, "Test Thread " +ii).start(); // I always name my threads.
}
// all threads are now waiting on the latch.
latch.countDown(); // release the latch
// all threads are now running the test method at the same time.
यह या एक संघर्ष का उत्पादन नहीं हो सकता है। मेरा testMethod() एक संघर्ष होने पर अपवाद फेंकने में सक्षम होना चाहिए। लेकिन हम अभी तक यह सुनिश्चित नहीं कर सकते कि इससे संघर्ष उत्पन्न होगा। तो हम नहीं जानते कि परीक्षण मान्य है या नहीं। तो यहां चाल है: अपने सिंक्रनाइज़ किए गए कीवर्ड (ओं) पर टिप्पणी करें और परीक्षण चलाएं। यदि यह एक संघर्ष पैदा करता है, तो परीक्षण विफल हो जाएगा। यदि यह सिंक्रनाइज़ किए गए कीवर्ड के बिना विफल रहता है, तो आपका परीक्षण मान्य है।
मैंने यही किया, और मेरा परीक्षण विफल नहीं हुआ, इसलिए यह (अभी तक) एक वैध परीक्षण नहीं था। लेकिन मैं उपरोक्त कोड को लूप के अंदर रखकर विफलता का उत्पादन करने में सक्षम था, और इसे लगातार 100 बार चला रहा था। इसलिए मैं विधि 5000 बार बुलाता हूं। (हाँ, यह धीमी परीक्षा का उत्पादन करेगा। इसके बारे में चिंता न करें। आपके ग्राहकों को इससे परेशान नहीं किया जाएगा, इसलिए आपको या तो नहीं करना चाहिए।)
एक बार जब मैं इस कोड को बाहरी लूप के अंदर रखता हूं, तो मैं बाहरी लूप के 20 वें पुनरावृत्ति पर असफलता को देखने में सक्षम था।अब मुझे विश्वास था कि परीक्षण मान्य था, और मैंने वास्तविक परीक्षण चलाने के लिए सिंक्रनाइज़ किए गए कीवर्ड को पुनर्स्थापित किया। (यह काम किया।)
आप खोज सकते हैं कि परीक्षण एक मशीन पर मान्य है और दूसरे पर नहीं। यदि परीक्षण एक मशीन पर मान्य है और आपके तरीके परीक्षण पास करते हैं, तो यह संभवतः सभी मशीनों पर थ्रेड-सुरक्षित है। लेकिन आपको उस मशीन पर वैधता की जांच करनी चाहिए जो आपके रात के यूनिट परीक्षण चलाती है।
मैंने आपके द्वारा पहले वर्णित तरीके से यूनिट परीक्षण किए हैं, लेकिन हमेशा महसूस किया जाता है कि परिणाम में यादृच्छिकता का एक तत्व है, इसलिए मैं यहां ब्याज के साथ उत्तरों का पालन करूंगा: o) –
डुप्लिकेट: http: // stackoverflow.com/questions/1715822/unit-test-for-thread-safe-ness – JeffH
@ जेफ हाँ, आपको यह अधिकार मिला। Pffffff, एक एसओ पुलिस होने की कोशिश छोड़ दिया। –