assertEquals vs. assertEqual w pythonie

184

Czy istnieje różnica pomiędzy assertEqualsoraz assertEqualw Pythonie unittest.TestCase?

A jeśli nie, to dlaczego są dwie funkcje? Tylko dla wygody?

Janusz
źródło

Odpowiedzi:

209

Dobre pytanie!

Faktycznie, w Pythonie 2.6, zarówno assertEquali assertEqualssą aliasy wygodę failUnlessEqual. Źródło deklaruje je w ten sposób:

 # Synonyms for assertion methods
 assertEqual = assertEquals = failUnlessEqual

W Pythonie 3 , do tego stopnia, failUnlessEqualjest wyraźnie przestarzałe. assertEqualsprzenosi ten komentarz :-)

# Synonimy dla metod asercji

# Liczba mnoga jest nieudokumentowana. Trzymaj je w ten sposób, aby zniechęcić do korzystania.

# Nie dodawaj więcej. Nie usuwać.

# Przechodzenie przez cykl amortyzacji na nich denerwuje wiele osób.

Wydaje się więc, że powinieneś używać, co chcesz w Pythonie 2.x, ale dążyć do assertEqualPythona 3.

Jarret Hardie
źródło
34
W rzeczywistości komentarz na temat liczby mnogiej jest niejednoznaczny. Mówi, że „liczba mnoga” jest nieudokumentowana. Ostatnie zdanie wskazuje, że rozumiesz to jako nazwę metody kończącą się na „s”, na przykład assertEquals. Jednak gramatycznie równość jest formą czasownika w liczbie pojedynczej (3 osoby), a nie w liczbie mnogiej. Myślę, że dobrze zrozumiałeś, co miał na myśli komentator, ale słowo „liczba mnoga” jest błędne.
LarsH
45

Aktualizacja 3.3: Od 26.3.7.1.1. Przestarzałe aliasy :

Ze względów historycznych niektóre metody TestCase miały jeden lub więcej aliasów, które są już nieaktualne. W poniższej tabeli wymieniono prawidłowe nazwy wraz z nieaktualnymi aliasami:

Method Name   | Deprecated alias | Deprecated alias
--------------+------------------+-----------------
assertEqual() | failUnlessEqual  | assertEquals
...
Matthew Cornell
źródło
24

Nie tylko dla Python 3.x, ponieważ Python 2.7 assertEqualsrównież jest przestarzały:

Method Name            | Deprecated alias(es)
_________________________________________________________
assertEqual()          | failUnlessEqual, assertEquals

Od 25.3.7.1.1. Przestarzałe aliasy

chungnho
źródło
5

Myślę, że to napięcie między „jedynym oczywistym sposobem na zrobienie tego” a „aliasem, aby cały kod płynął semantycznie”. Osobiście uważam, że lubię czytać

failIf(some_condition)

nad

assertFalse(some_condition)

ale lubiłem

assertEqual(a, b)

nad pozostałymi dwoma ( assertEquals(a, b)przeszkadza mi poczucie gramatyki).

„Tylko jeden oczywisty sposób na zrobienie tego” ma pierwszeństwo w przyszłości.

Kathy Van Stone
źródło
3

Nie znalazłem żadnej wzmianki o assertEquals w http://docs.python.org/library/unittest.html . Jednak po zaimportowaniu TestCase, a następnie „pomocy (TestCase)”, jest na liście. Myślę, że to tylko synonim wygody.

Fred Larson
źródło
10
Tak, ale poważnie łamie mantrę „jedyny oczywisty sposób na to” :-(.
Alex Martelli
4
@Alex - Nie dostaniesz ode mnie żadnych argumentów.
Fred Larson
0

Wiem, że nie odpowiada na konkretne pytanie, ale jeśli dotarłeś tutaj podczas wyszukiwania:

using deprecated method assertEquals()

Musisz tylko zmienić wywołanie na .assertEqual () (usuń „s” w równości)

mrmuggles
źródło
-1

Jest prawie tak samo, z wyjątkiem tego, że assertEquals jest powtórzone. Zalecane jest użycie assertEqual jak tutaj:

# Synonyms for assertion methods
# The plurals are undocumented.  Keep them that way to discourage use.
# Do not add more.  Do not remove.
# Going through a deprecation cycle on these would annoy many people.


      assertEquals = assertEqual

Źródło online: https://github.com/python/cpython/blob/e42b705188271da108de42b55d9344642170aa2b/Lib/lib2to3/fixes/fix_asserts.py

Rabhi Salim
źródło
1
Technicznie rzecz biorąc masz rację, ale jedno z nich jest przestarzałe, a drugie nie. Kod, który podłączyłeś, ma na celu przepisanie nieaktualnych nazw na nieaktualne.
Marius Gedminas