2017-12-19 7 views
1

Von Linux Mint bash Typ IPytest keine Tests liefen

$ pytest tests/parser_test.py 
=============================== test session starts py ================================ 
platform linux2 -- Python 2.7.14, pytest-3.2.1, py-1.4.34, pluggy-0.4.0 
rootdir: /home/rat/Projects/ex48, inifile: 
collected 0 items                 

=========================== no tests ran in 0.00 seconds =========================== 

und doch sagt, es gibt es "kein Test lief". Ich habe jeden Funktionstest in Stufen durchgeführt und es hat eine Weile funktioniert, aber ich habe festgestellt, dass mit jeder zusätzlichen Funktion pytest weniger Tests aufnahm. Ich habe ein komisches Gefühl, dass es mit meinem Test-Code ist, aber ich bin mir nicht sicher, was ich falsch mache oder gar was zu suchen. Ich habe versucht, einige der Variablen von word_list_one zu wl_one zu ändern, um zu sehen, ob das das Problem ohne Erfolg war. Ich überprüfte auch ähnliche Fragen, konnte aber keine Antwort finden. Ich muss zugeben, dies ist meine erste Sprache, die ich gelernt habe, also bin ich sehr neu in diesem ganzen Test-Ding. Hier ist mein Projektbaum . ├── ex48 │   ├── __init__.py │   ├── __init__.pyc │   ├── lexicon.py │   ├── parser.py │   └── parser.pyc ├── README.md ├── setup.py └── tests ├── __init__.py ├── __init__.pyc ├── lexicon_tests.py ├── parser_test.py └── __pycache__ ├── parser_test.cpython-27-PYTEST.pyc └── parser_tests.cpython-27-PYTEST.pyc

import pytest 
from ex48 import parser 
from ex48.parser import Sentence 

# test parse_sentence 
@pytest.fixture() 
def test_sentence(): 
    sentence = Sentence.parse_sentence([("noun","player"),("verb", "go"),("noun", "bear")]) 
    return sentence 


def test_peek(): 
    result = test_sentence() 
    assert Sentence.peek(result) != None 

Nach dem Entfernen @classmethod, richtige Antwort von Hansaplast, brauchte ich die test_sentence zu ändern und hinzugefügt test_sentence (Selbst-) zu `` `as1 per this answer:

@pytest.fixture() 
def test_sentence(self): 
    sentence = Sentence() 
    return sentence.parse_sentence([("noun","player"),("verb", "go"),("noun", "bear")]) 

jedoch jetzt habe ich ein Problem mit der pytest Halterung

$ pytest tests/parser_test.py 
============================== ERRORS ==================================== 
___________________ ERROR at setup of test_peek __________________________ 
file /home/rat/Projects/ex48/tests/parser_test.py, line 13 
    def test_peek(test_sentence): 
file /home/rat/Projects/ex48/tests/parser_test.py, line 7 
    @pytest.fixture() 
    def test_sentence(self): 
E  fixture 'self' not found 
>  available fixtures: cache, capfd, capsys, doctest_namespace, 
     monkeypatch, pytestconfig, record_xml_property, recwarn, 
     test_sentence, tmpdir, tmpdir_factory 
>  use 'pytest --fixtures [testpath]' for help on them. 

So habe ich getippt $ pytest --fixtures Tests/parser_test.py und erhielt eine Vielzahl von Informationen, den Sinn für mich nicht, und dies macht:

------------- fixtures defined from tests.parser_test ------------------- 
test_sentence 
tests/parser_test.py:8: no docstring available 

könnte einfacher sein, zu löschen und neu beginnen, ohne @ pytest.fixtures = ^/

+1

Keine Screenshots, insbesondere von Textbefehlen. –

+0

Wo ist die tatsächliche Ausgabe? Ich wette, es gibt interessante Nachrichten, die Sie nicht erwähnen möchten. –

+0

Bitte erläutern Sie den '@ classmethod'-Dekorator außerhalb einer Klasse. –

Antwort

3

Schnell Antwort: Entfernen Sie die @classmethod Annotation und Ihr Test wird aufgerufen.

Lange Antwort: @classmethod außerhalb einer Klasse zu haben, ist eine irgendwie esoterisch Sache, this answer erklärt, dass es nur einen Descriptor erzeugt, die später zu einer Klasse gebunden werden können MyClass.attribute_name = test_peek verwenden. Das bedeutet, dass pytest test_peek nicht als eine Funktion sondern als ein Objekt sehen wird und es daher nicht aufrufen wird. Wenn Sie Ihren Code ex48 auf GitHub durchsehen, ordnen Sie dieses Objekt keiner Klasse zu, daher haben Sie wahrscheinlich die Bedeutung von @classmethod falsch verstanden und sollten diese Annotation einfach entfernen.

After removing @classmethod, correct answer from hansaplast, I needed to change the test_sentence and added test_sentence(self)

Ich sah schnell auf your code on github, gibt es einige Dinge falsch mit Ihrem Code

  • warum brauchen Sie das überhaupt @pytest.fixture()? Sie fügen nur die Anmerkungen hinzu, verwenden sie aber nicht.
  • Sie müssen nachsehen, um korrekt mit Klassen zu arbeiten. Ihre Klasse Sentence in nur haben Funktionen (dh keiner von ihnen verwendet self als Argument), auch in parser_tests.py haben Sie Funktionen, die selbst als ersten Parameter haben, auch wenn sie nicht in einer Klasse sind. Funktionen außerhalb Klassen nehmen nicht self, Funktionen (= Methoden) innerhalb Klassen nehmen self als ersten Parameter.
+0

OK, macht Sinn. Leider verursacht dies ein anderes Problem, das zuerst mit @classmethod behoben wurde. Seufzer –

+0

Kannst du das Problem erklären, wenn du '@ classmethod' entfernst? – hansaplast

+0

War mir nicht sicher, ob ich das im Stakeoverflow machen durfte, muss gestehen, ich versuche hier nicht zu posten. NameError: Der globale Name 'parse_object' ist nicht definiert. <--- parse_object ist eine Funktion in der Datei parser.py. –

Verwandte Themen