পাইস্ট: প্রায় সমান দাবী করা


145

assert almost equalPy.est সাথে কীভাবে করবেন এমন কোনও কিছু অবলম্বন না করে ভাসমানদের জন্য:

assert x - 0.00001 <= y <= x + 0.00001

আরও নির্দিষ্টভাবে ফ্লোটের জোড়গুলি আনপ্যাক না করে দ্রুত তুলনা করার জন্য একটি ঝরঝরে সমাধান জানা আরও কার্যকর হবে:

assert (1.32, 2.4) == i_return_tuple_of_two_floats()

3
পাই.টেস্টে এখন এমন একটি বৈশিষ্ট্য রয়েছে যা এটি করে।
dbn

এই বৈশিষ্ট্যটির বর্ণনার জন্য এই উত্তরটি দেখুন
টম হেল

উত্তর:


232

আমি লক্ষ্য করেছি যে এই প্রশ্নটি বিশেষভাবে পাইস্টেস্ট সম্পর্কে জিজ্ঞাসা করেছিল। পাইস্টেস্ট 3.0.০ এ একটি approx()ফাংশন (ভাল, সত্যই শ্রেণি) অন্তর্ভুক্ত যা এই উদ্দেশ্যে খুব দরকারী useful

import pytest

assert 2.2 == pytest.approx(2.3)
# fails, default is ± 2.3e-06
assert 2.2 == pytest.approx(2.3, 0.1)
# passes

# also works the other way, in case you were worried:
assert pytest.approx(2.3, 0.1) == 2.2
# passes

ডকুমেন্টেশন এখানে রয়েছে: https://docs.pytest.org/en/latest/references.html#pytest-approx


12
নিস! এটি সংখ্যার ক্রমগুলির জন্যও খুব কার্যকর কাজ করেছে যেমনassert [0.1 + 0.2, 0.2 + 0.4] == pytest.approx([0.3, 0.6])
মিঃ ক্রিস

4
@ মিঃ ক্রিস এবং এমনকি ডিক্টের জন্যও:assert {'a': 0.1+0.2} == pytest.approx({'a': 0.3})
অ্যান্টনি হ্যাচকিন্স

4
এই তালিকার তালিকার জন্য কাজ করে না: যেমন, assert [[0.1 + 0.2], [0.2 + 0.4]] == pytest.approx([[0.3], [0.6]])একটি থেকে বিশালাকার TypeError। যদি পাওয়া যায় যে নম্পি np.testing.assert_allclose([[0.1 + 0.2], [0.2 + 0.4]], [[0.3], [0.6]])(নীচে উত্তর দেখুন) এই ক্ষেত্রে কাজ করেছে।
কুর্ট পিক

43

আপনার জন্য "প্রায়" কী তা নির্দিষ্ট করতে হবে:

assert abs(x-y) < 0.0001

টিপলসগুলিতে (বা কোনও ক্রম) প্রয়োগ করতে:

def almost_equal(x,y,threshold=0.0001):
  return abs(x-y) < threshold

assert all(map(almost_equal, zip((1.32, 2.4), i_return_tuple_of_two_floats())

3
প্রশ্নটি জিজ্ঞাসা করে যে "এটির মতো কিছু না করে" কীভাবে এটি করা যায়
এন্ডোলিথ

আমি "এর মতো কিছু" এর পুনরাবৃত্ত এবং বিশ্রী অভিব্যক্তি হিসাবে ব্যাখ্যা করি x - d <= y <= x+d, মনে হয় এটি ওপিও বোঝায়। আপনি যদি 'প্রায়' এর জন্য স্পষ্টভাবে প্রান্তিকতা নির্দিষ্ট করতে না চান তবে @ jiffyclub এর উত্তর দেখুন।
ইওরিব

2
পাই.টেস্টে এখন এমন একটি বৈশিষ্ট্য রয়েছে যা এটি করে। আমি এটি আলোচনা করে একটি উত্তর যুক্ত করেছি।
dbn

2
@ নীলজি পৃথিবীতে কেন এটি মুছে ফেলা উচিত? যদি এর সাথে অবশ্যই কিছু ভুল হয় তবে দয়া করে এটি কী তা ব্যাখ্যা করুন explain
ব্যবহারকারী2699

1
@ user2699 প্রশ্নটি কীভাবে পাইয়েস্টে এটি করা যায়। পাইস্টে এটি করার সঠিক উপায়টি হ'ল ব্যবহার করা pytest.approx। আপনার নিজের আনুমানিক ফাংশনটি লেখা একটি খারাপ ধারণা। (এই উত্তরের উত্তরটি অন্তর্ভুক্ত হওয়া জবাবের মতো উত্তম নয়))
নিল জি

31

আপনার যদি নম্পপিতে অ্যাক্সেস থাকে তবে এটিতে ভাসমান পয়েন্ট তুলনা করার জন্য দুর্দান্ত ফাংশন রয়েছে যা ইতিমধ্যে এর সাথে জুটিবদ্ধ তুলনা করে numpy.testing

তারপরে আপনি এর মতো কিছু করতে পারেন:

numpy.testing.assert_allclose(i_return_tuple_of_two_floats(), (1.32, 2.4))

11

কিছুটা এইরকম

assert round(x-y, 5) == 0

এটা কী unittest করে

দ্বিতীয় অংশের জন্য

assert all(round(x-y, 5) == 0 for x,y in zip((1.32, 2.4), i_return_tuple_of_two_floats()))

সম্ভবত একটি ফাংশন এ মোড়ানো ভাল

def tuples_of_floats_are_almost_equal(X, Y):
    return all(round(x-y, 5) == 0 for x,y in zip(X, Y))

assert tuples_of_floats_are_almost_equal((1.32, 2.4), i_return_tuple_of_two_floats())

11

এই উত্তরগুলি দীর্ঘকাল ধরে রয়েছে, তবে আমি মনে করি সবচেয়ে সহজ এবং সবচেয়ে পঠনযোগ্য উপায় হ'ল ইউনিটেট ব্যবহার করার জন্য এটির অনেকগুলি সুন্দর বক্তব্য এটির পরীক্ষার কাঠামোর জন্য এটি ব্যবহার না করেই এটি ব্যবহার করা।

দৃ Get়তা পান, ইউনিটেস্ট.স্টেস্টকেসের বিশ্রামটি উপেক্ষা করুন

( এই উত্তরের ভিত্তিতে )

import unittest

assertions = unittest.TestCase('__init__')

কিছু জোর দেওয়া

x = 0.00000001
assertions.assertAlmostEqual(x, 0)  # pass
assertions.assertEqual(x, 0)  # fail
# AssertionError: 1e-08 != 0

আসল প্রশ্নের 'অটো-প্যাকিং পরীক্ষা বাস্তবায়ন করুন

নতুন নাম প্রবর্তনের প্রয়োজন ছাড়াই আপনার রিটার্নের মানটি আনপ্যাক করতে কেবল * ব্যবহার করুন।

i_return_tuple_of_two_floats = lambda: (1.32, 2.4)
assertions.assertAlmostEqual(*i_return_tuple_of_two_floats())  # fail
# AssertionError: 1.32 != 2.4 within 7 places

6

আপনি যদি এমন কিছু চান যা কেবল ভাসমানদের সাথেই কাজ করে না তবে উদাহরণস্বরূপ দশমিকগুলি আপনি পাইথনের ব্যবহার করতে পারেন math.isclose:

    # - rel_tol=0.01` is 1% difference tolerance.
    assert math.isclose(actual_value, expected_value, rel_tol=0.01)

দস্তাবেজ - https://docs.python.org/3/library/math.html#math.isclose


এখানে আপেক্ষিক সহনশীলতা (বা শতাংশের পার্থক্য) কিছু ব্যবহার ক্ষেত্রে যেমন সুবিধাজনক যেমন বিজ্ঞানসম্মত use
করিয়োকি

3

আমি নাক.টুল ব্যবহার করব। এটি পাই.এস্টেস্ট রানারের সাথে ভাল খেলে এবং অন্যান্য সমানভাবে কার্যকর দাবী রয়েছে - assert_dict_equal (), assert_list_equal () ইত্যাদি

from nose.tools import assert_almost_equals
assert_almost_equals(x, y, places=7) #default is 7 

2
পাইস্টেস্টেরও এর জন্য একটি বিকল্প রয়েছে আমি একটি ভাল বিকল্প বিবেচনা করি না শুধুমাত্র এটির জন্য অতিরিক্ত হ্রাস (এই ক্ষেত্রে, একটি সম্পূর্ণ টেস্টিং ফ্রেমওয়ার্ক)।
মার্ক টুডুরí
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.