Junit4: التحسين: دعم BigDecimal لـ assertEquals ()

تم إنشاؤها على ٢٥ مارس ٢٠١٠  ·  27تعليقات  ·  مصدر: junit-team/junit4

يعد استخدام JUnit لاختبار قيم BigDecimal دائمًا نقطة مؤلمة. ذلك لأن BigDecimal يعتبر الدقة باستخدام يساوي () ولكنه يتجاهلها في المقارنة (). أفضل طريقة للتعامل مع هذا هو أسلوب assertEquals الجديد الذي يسمح بتقييم الدقة بشكل اختياري. يمكنك أيضًا إضافة طريقة بديلة تقبل رسالة:

assertEquals ثابت ثابت عام (توقع BigDecimal ، BigDecimal فعلي ، دقة منطقية) {
إذا (الدقة) {
Assert.assertEquals (متوقع ، فعلي) ؛
} آخر {
Assert.assertEquals (0، due.compareTo (فعلي))؛
}
}

feature

التعليق الأكثر فائدة

هل حاولت استخدام comparesEqualTo ؟

ال 27 كومينتر

سيكون من السهل تجميعها كشوكة أو رقعة ؛ سأكون على استعداد للقيام بذلك إذا كان ذلك مناسبًا.

أفضّل أن يكون لدي تأكيدًا عدديًا متساوٍ بدلاً من العلم المنطقي الذي تم تمريره لتأكيد المساواة.

هذا اسم جيد. أود أن أقصرها لتأكيد المساواة العددية ().

بينما أتفق مع المشاعر ، لست متأكدًا من أن وجود طريقة تأكيد أخرى باسم مختلف سيساعد حقًا في إزالة الارتباك خاصة بين الأشخاص غير المدركين تمامًا للاختلاف أو الذين لم يواجهوا المشكلة بأنفسهم. أعني ، إذا لم أقرأ هذه المشكلة ، لكنت مضيت إلى الأمام واستخدمت assertEquals() مقابل BigDecimal . في الحالة العامة ، سيعمل في الواقع كما هو معلن - سيعمل بالضبط كيف يعمل BigDecimal#equals() . أود أن أزعم أن هذا أمر جيد - فهو يجبر شخصًا ما على إدراك أن BigDecimal#equals() يقارن بين القيمة والمقياس ، فربما لم يكن هذا ما كانوا يحاولون تحقيقه - على الرغم من ذلك ، في حالات أخرى ، أفترض ذلك _يكون_. أعني ، في بعض الحالات ، نريد التحقق من أن القيمة الفعلية التي يتم إرجاعها بواسطة طريقة ما هي _تساوي_ "مساوية" للقيمة المتوقعة (وليس فقط متساوية منطقيًا / رقميًا). بعبارة أخرى: ما الذي يقدمه assertNumericallyEquals() (بصرف النظر عن الإيجاز) والذي لا يقدمه assertEquals(0, actual.compareTo(expected)) ؟ شخصيًا ، ربما كنت أقوم بإنشاء أداة مطابقة Hamcrest وأذهب إلى assertThat(actual, isNumericallyEqualTo(expected)) إذا كنت بحاجة إليها كثيرًا - بالإضافة إلى ذلك ، يمكن استخدامها في أي مكان يمكن استخدام مطابقات Hamcrest (التحقق من صحة البيانات ، من بين أمور أخرى).

آسف للوزن المتأخر ، لكن رأيي الشخصي قريب من رأي أليستير.

بعبارة أخرى: ما الذي يقدمه assertNumericallyEquals() (بصرف النظر عن الإيجاز) والذي لا يقدمه assertEquals(0, actual.compareTo(expected)) ؟

ينقل النية بشكل أكثر وضوحًا؟ نهج hamcrest المطابق جيد بالنسبة لي.

جيفري

هل تقول إنك تكتب هذا المطابق لمشروعك الخاص ، أو أنك تتمنى أن يتم شحنها مع hamcrest؟ أو JUnit ، ولكن ليس hamcrest؟

أي من أو كل ما سبق - ينتهي الأمر بمعظم المشاريع التي أكتبها بالحصول على بعض أدوات مطابقة hamcrest المخصصة. وجود الحالات الشائعة التي يغطيها Hamcrest و / أو JUnit يوفر القليل من الوقت ، ولكن هذا أيضًا لم يكن حالة شائعة جدًا بالنسبة لي.

نقطة صغيرة حول رسائل الخطأ الأقل فائدة .. لقد قمت للتو بتحويل مكالمات Assert.assertEquals الخاصة بي إلى Assert.assertTrue بعد أن فشلت في مقارنة BigDecimals مع Assert.assertEquals. بالطبع فشلت اختباراتي الآن مع نوع من الخطأ "فشل الاختبار المنطقي" ، دون أن تخبرني ما هي القيم. بالطريقة نفسها ، فإن assertEquals (0 ، active.compareTo (متوقع)) ستسجل على سبيل المثال "متوقع 0 ولكن حصلت على: 1" عندما تكون رسالة خطأ مفيدة أكثر بكثير من assertNumericallyEquals (الفعلية ، المتوقعة) ستكون "متوقعًا 12.45 ولكن تم الحصول عليها : 123 "(القيم الفعلية للوسيطات" الفعلية "و" المتوقعة ").

http://www.bssd.eu/blog/؟p=113 تجعل القراءة ممتعة أيضًا.

assertEquivalent من https://github.com/KentBeck/junit/pull/228 يجب أن يحل هذا.

شكرا dsaff. هذا العمل يبدو رائعا. لم أفعل هذا من قبل ، فهل هذا يعني أنه يجب علي إحضار مصدر junit ، ودمج طلب السحب هذا بنفسي ، وإنشاء بنية مخصصة؟

من المساعدة في http://help.github.com/send-pull-requests/ يبدو أنه ينبغي علي:

استنساخ بوابة https://github.com/KentBeck/junit.git
cd junit

ثم قم بإضافة جهاز تحكم عن بعد لطلب السحب ، ثم قم إما بالجلب أو الدمج أو القيام بالأمرين معًا.

بالنظر إلى أن هذا يبدو أنه طلب سحب ، أي أنه ليس طلبًا رسميًا ، فهل من الحكمة استخدامه في أحد التطبيقات؟ هل هناك احتمال أن يتعثر هذا خارج الوحدة الرئيسية ، وسأواجه مشكلات في إرسال الكود الخاص بي إلى الآخرين ، والذين لن يتم إنشاؤه لهم؟

نيكفينويك ،

نعم ، أنت على المسار الصحيح حول كيفية القيام بذلك الآن. أنوي دمج ذلك في الفرع 4.10 ، لكن المؤلف الأصلي واجه مشكلة في دمج حالة git. إذا كان لديك الوقت لتقديم خدمة للعالم ، فيمكنك أن تفرز مستودع KentBeck ، ودمج كل شيء ، وإصدار طلب سحب مقابل الفرع 4.10 ، بحيث يكون الأمر أسهل للجميع (إذا كان يبدو رائجًا ، فيمكنني حتى التدوير حتى وقت ما 4.10 جرة معاينة).

لم أفعل هذا من قبل :) لذا قمت بتقسيم الريبو واستنساخ

git remote add upstream https://github.com/KentBeck/junit.git

فقط من أجل القياس الجيد لقد تفرعت حتى أتمكن من دمج طلب السحب في مكان آخر غير HEAD:

git branch merge_pullreq_228
git checkout merge_pullreq_228

الآن المستندات التي يمكنني العثور عليها تقول "الآن ادمج طلب السحب في فرعك". يمكنني رؤية التزامات السحب 228 على https://github.com/KentBeck/junit/pull/228/commits ولكن لا يمكنني دمجها:

[neek junit (merge_pullreq_228)]$ git merge 57b49344
fatal: '57b49344' does not point to a commit

نظرًا لأن طلب السحب ليس خاصًا بفرع الريبو / الفرع الخاص بي ، فلا يمكنني استخدام أدوات الدمج في واجهة ويب جيثب (AFAIK).

هل أنا محق في اعتقادي أنك تريد مني دمج 7 التزامات في فرعي الخاص والحصول عليه لبناء / اجتياز اختبارات الوحدة؟ هل يمكنك توضيح ما يجب فعله لدمج أحد هذه الالتزامات ليضعني في طريقي؟

حسنًا ، لا يمكنك استخدام أدوات دمج الويب. ما أعتقد أنه يجب أن يعمل هو:

git remote add leet3lite https://github.com/leet3lite/junit.git

ثم اتصل من فرعك

بوابة سحب سيد leet3lite

لسوء الحظ ، عادةً ما أنسى شيئًا واحدًا عند وصف كيفية استخدام git "عبر الهاتف" ، لذا يُرجى إعلامي إذا كان ذلك يناسبك.

آه فهمت ، لست بحاجة إلى دمج كل من هذه الالتزامات .. يحتوي الفرع الرئيسي لـ leet3lite عليها بالفعل ، وهي عملية دمج هذا العمل في المعلم الأصلي هذه هي المشكلة.

يبدو أن هناك تعارضات دمج بين هذا الفرع و HEAD. أعتقد أن هذا هو بيت القصيد من هذا التمرين.

[neek junit (merge_pullreq_228)]$ git remote add leet3lite https://github.com/leet3lite/junit.git
[neek junit (merge_pullreq_228)]$ git pull leet3lite master
remote: Counting objects: 100, done.
remote: Compressing objects: 100% (39/39), done.
remote: Total 85 (delta 34), reused 77 (delta 26)
Unpacking objects: 100% (85/85), done.
From https://github.com/leet3lite/junit
 * branch            master     -> FETCH_HEAD
Auto-merging acknowledgements.txt
CONFLICT (content): Merge conflict in acknowledgements.txt
Auto-merging src/main/java/org/junit/Assert.java
Auto-merging src/test/java/org/junit/tests/AllTests.java
CONFLICT (content): Merge conflict in src/test/java/org/junit/tests/AllTests.java
Automatic merge failed; fix conflicts and then commit the result.
[neek junit (merge_pullreq_228|MERGING)]$ 

إذا كان هذا يبدو معقولًا بالنسبة لك ، فسأستمر في ذلك غدًا. ما يقرب من منتصف الليل هنا.

يبدو أنك في المكان الصحيح. يتم التطرق بشكل كبير في accgements.txt و AllTests.java ، عادةً فقط مع الإضافات ، لذلك من المحتمل أن تكون عملية الدمج عملية بسيطة تتضمن تضمين جميع الأسطر المضافة في كلا المسارين.

شكرا جزيلا لدفع هذا قدما.

أعتقد أن هذا تم إصلاحه منذ عامين.

dsaff - لا ...؟

ليس في 4.11 ؛ (أحتاج هذه الميزة أيضًا

انتقل النقاش على assertEquivalent() إلى # 228 وبعد ذلك ، أعتقد أنه انتقل إلى # 376 حيث قررنا أن Hamcrest يجب أن يحل هذا.

@ junit-team / junit-committers أي اعتراضات علي إغلاق هذا؟

لا اعتراضات من جانبي.

عفوًا ، انقر فوق فرويد. :-) لا اعتراضات هنا.

تمام. ثم الختام.

لا أعتقد أن استخدام hamcrest المطابق يصلح هذه المشكلة. على سبيل المثال هذا الرمز:

   assertThat(product.getRating(), is(equalTo(new BigDecimal("2.3"))));

ستنتج هذه النتيجة:

Expected: is <2.3>
     but: was <2.30000>

أعتقد أن junit أو hamcrest لا يزالان بحاجة إلى طريقة isNumericEquivalent .

هل حاولت استخدام comparesEqualTo ؟

نعم ، comparesEqualTo يعمل بالفعل. شكرا.

إليك ورقة الغش التي أنشأتها منذ بعض الوقت:
http://www.marcphilipp.de/blog/2013/01/02/hamcrest-quick-reference/

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات