Python-Vorlage für Codeforces-manuelle Test-

Hintergrund

Der Hintergrund des Problems macht überraschend viel Spaß beim Lesen.

Es ist schon eine Weile her, dass ich vom Wettbewerb begeistert war, deshalb habe ich in den letzten Tagen einfache Probleme als Rehabilitation gelöst. Da dies eine gute Idee ist, habe ich die Umgebung von C ++ + Emacs, die ich in der Vergangenheit verwendet habe, in Python + PyCharm geändert.

Zu diesem Zeitpunkt habe ich eine Vorlage erstellt, die das Hinzufügen von Tests (so wie sie ist) vereinfacht, und ich werde sie hier veröffentlichen. Unten finden Sie eine Beschreibung der erstellten Vorlage.

Ziele und Einschränkungen

Zuallererst ist es die eiserne Regel des Wettkampfprofis, die Randbedingungen zu überprüfen.

Dieses Mal werden wir Codeforces unter den vielen wettbewerbsfähigen Pro-Sites ansprechen. Codeforces bietet folgende Funktionen:

  1. Kommunizieren Sie mit der Standardeingabe / -ausgabe
  2. Es gibt höchstens 3 Testfälle
  3. Sie können die Datei so wie sie ist senden

Da nur wenige Testfälle verfügbar sind, ist der Schlüssel zunächst, wie einfach es ist, eigene Tests hinzuzufügen. (Umgekehrt besteht wenig Bedarf, Testfälle automatisch aus Problemstellungen zu generieren.)

Das wichtigste Merkmal ist, dass es zu diesem Zeitpunkt zu einem Engpass wird. Beim Austausch von Funktionsargumenten und Rückgabewerten (Wettbewerbe wie TopCoder) können Sie Unit-Tests normal schreiben, sodass Sie problemlos IDE-Unterstützung erhalten. Die Standardeingabe / -ausgabe wird jedoch nicht so stark unterstützt, und es scheint selbst mit jUnit schwierig zu sein, sie zu testen. Daher ist es notwendig, eine etwas mühsame Methode anzuwenden.

Wenn Sie die Datei so wie sie ist einreichen, wird es auch einfacher, daher möchte ich sie so gestalten, dass sie so wie sie ist eingereicht werden kann.

Die Vorlage, die ich gemacht habe

In die Form einpassen.

Die Einführung ist lang geworden, aber ich werde die Vorlage, die ich gemacht habe, hier einfügen. Es gibt 2 Dateien, Eine ist eine Datei, in der Sie den Code schreiben und so wie er ist senden können. Die andere ist eine Datei, die den Test beschreibt.

Zuerst die Datei, die den Code schreibt. Schau nicht hin! Nach (CV: Umes) ist es ein Teil, den Sie beim Lösen des Problems nicht sehen müssen.

main.py


# -*- coding: utf-8 -*-
import sys
#Erhöhen Sie den erforderlichen Import


class Solver(object):

    def run(self):
        ###Listen Sie die Antwort hier auf###


####################################
#Schau nicht von hier aus!

###Listen Sie die Bibliothek hier auf###

if __name__ == '__main__':
    Solver().run()

Als nächstes die Datei, um den Test zu schreiben.

test_solver.py


# -*- coding: utf-8 -*-
from unittest import TestCase


data = [
    (
        """
Eingabe 1
""".strip()
        ,
        """
Antwort 1
""".strip()
    ),

    (
        """
Eingabe 2
""".strip()
        ,
        """
Antwort 2
""".strip()
    ),
]


########################################
#Schau nicht von hier aus!

class TestSolver(TestCase):
    def test_run(self):
        import os
        import sys
        from StringIO import StringIO
        import main

        for i, testdata in enumerate(data):
            print(str(i) + " test...")
            saved_stdout = sys.stdout
            try:
                with open("temp_data.txt", "w+") as temp:
                    temp.write(testdata[0])

                fd = os.open("temp_data.txt", os.O_RDONLY)
                os.dup2(fd, sys.stdin.fileno())

                out = StringIO()
                sys.stdout = out

                main.Solver().run()
                output = out.getvalue().strip()

                self.assertEquals(output, testdata[1])
            finally:
                sys.stdout = saved_stdout

Erläuterung

Durch Ausführen von TestSolver.test_run () in test_solver.py wird die am Anfang der Datei definierte Testfallgruppe ausgeführt. In dieser Funktion Empfängt Standardeingaben aus der Datei Leiten Sie die Standardausgabe zu Variablen um tun. Auf diese Weise können Sie den Standardeingang durch den Standardausgang ersetzen.

Einfallsreichtum

In den Testfällen werden hier Dokumente verwendet, sodass Sie sie einfach durch Kopieren hinzufügen können. Es ist kein Mäusetraining erforderlich.

Muss die Standardeingabe nicht eine Datei durchlaufen? Ich dachte, aber aus irgendeinem Grund konnte ich es nicht tun, also gab ich auf (eine detaillierte Person plz). Außerdem schreibe ich absichtlich den Ort, an den ich mit tempfile schreiben könnte, in die eigentliche Datei, aber Windows? In einem kleineren Betriebssystem wie z. B. werde ich wütend, weil ich keine Berechtigung zum Lesen von tempfile habe. Es ist mühsam, es zu vermeiden ... Ich konnte es nicht tun, also gab ich auf (eine detaillierte Person plz).

Wie benutzt man

Fast wie Sie sehen können. Grundsätzlich müssen Sie nur den Bereich über der Datei bearbeiten.

Zusammenfassung

rekursiver Aufruf

Die Vorlage ist nur eine Datei, sodass Sie sie in Kombination mit Ihrem bevorzugten Editor verwenden können. PyCharm ist einfach und nett als komfortabler Codierer. Es gibt auch eine automatische Vervollständigung, und die Ausführung ist mit Tastenkombinationen einfach. Natürlich ist es auch eine gute Idee, es mit Emacs oder Vim zu kombinieren und mit einem vertrauten Editor zu kämpfen. Es hat keinen Sinn, Emacs an erster Stelle zu haben.

Schließlich

Dies macht es noch bequemer! Wenn Sie das Wissen haben, kommentieren Sie bitte.

Recommended Posts

Python-Vorlage für Codeforces-manuelle Test-
Python-Unit-Test-Vorlage
Vorverarbeitungsvorlage für die Datenanalyse (Python)
Erstelltes AtCoder-Testtool für Python
Python [für mich]
Vorlage zum Schreiben von Batch-Skripten in Python
Python-Integritätstest
Python Argparse Vorlage
[Python] Tkinter-Vorlage
Vorlage zum Erstellen von Befehlszeilenanwendungen in Python
Python-Vorlage, die eine Protokollanalyse mit explosiver Geschwindigkeit durchführt
Primzahlbeurteilung durch Python
Primzahlbeurteilung mit Python
Python-Grundlagen ② für Anweisung
Python Basic 8 Numpy Test
Wettbewerbsfähige Pro-Vorlage (Python)
Über Python für ~ (Bereich)
Primzahlbeurteilung mit Python
Python Lehrbuch für Anfänger
Toolchain für Python für Android
Python-Datenanalysevorlage
Jinja2 | Python-Vorlagen-Engine
Python-Tag-Kooperationstest
Python Template Engine Empy
OpenCV für Python-Anfänger
Testautomatisierung für die Arbeit
Installieren Sie Python (für Windows)
[Python] für Anweisungsfehler
Wartung der Python-Umgebung für Projekte
Python-Memo (für mich): Array
Python-Liste, für Anweisung, Wörterbuch
Python für die Datenanalyse Kapitel 4
Ich habe das neueste automatische Testtool "Playwright for Python" berührt.
Lernablauf für Python-Anfänger
Installationsverfahren für Python 3.6 [für Windows]
Algorithmus in Python (Haupturteil)
BigQuery-Integration für Python-Benutzer
Für die Prüfung G-Test 2020 # 2
Pipeline-Vorlage für DataLiner vorverarbeiten
Python-Lernplan für KI-Lernen
Für Mac einrichten (Python)
Python Tkinter Memo (für mich)
OpenCV3-Installation für Python3 @macOS
Aufbau einer Python-Umgebung für Mac
Testcode zur Bewertung von Dekorateuren
Techniken zum Sortieren in Python
pp4 (Python Power für alles)
Python3-Umgebungskonstruktion (für Anfänger)
Installation der Python 3-Serie für Mac
Python #Funktion 2 für Super-Anfänger
Grundlegende Python-Grammatik für Anfänger
Notizen für 3 Monate, seit ich Python gestartet habe
Qt für Python App Selbstaktualisierung
Python-Debug- und Testmodul
2015 Center Exam Math IIB Lösen mit Python
Python für die Datenanalyse Kapitel 2
100 Pandas klopfen für Python-Anfänger