Python unit test: stdout testovaneho do souboru

JanS

Python unit test: stdout testovaneho do souboru
« kdy: 27. 05. 2016, 15:39:34 »
Zdravim,
pisu unit test funkce, ktera generuje kopec veci do stdout. Stdout vystup funkce chci presmerovat do souboru, ale vystupy testu nechat v stdout.
Nejake tipy?
Diky


gl

Re:Python unit test: stdout testovaneho do souboru
« Odpověď #1 kdy: 27. 05. 2016, 17:07:13 »
zkuste před voláním funkce přepsat sys.stdout a po konci volání ho přepsat zpět. Jde to udělat wrapperem.

gl

Re:Python unit test: stdout testovaneho do souboru
« Odpověď #2 kdy: 27. 05. 2016, 17:34:05 »

import sys
from contextlib import contextmanager
import functools

@contextmanager
def stdout(filename):
    with open(filename, 'a') as outfile:
        stdout_old = sys.stdout
        sys.stdout = outfile
        yield
        sys.stdout = stdout_old


def redirect_stdout(f, filename):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        with stdout(filename):
            f(*args, **kwargs)
    return wrapper



def testfn():
    print 'hello'

testfn() # vypise hello na standartni vystup

testfn = redirect_stdout(testfn, 'somefile.txt')

testfn() # vypise hello do souboru somefile.txt


gl

Re:Python unit test: stdout testovaneho do souboru
« Odpověď #3 kdy: 27. 05. 2016, 17:48:37 »
Zapoměl jsem return. Mělo to být:


def redirect_stdout(f, filename):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        with stdout(filename):
            return f(*args, **kwargs)
    return wrapper

gl

Re:Python unit test: stdout testovaneho do souboru
« Odpověď #4 kdy: 27. 05. 2016, 18:19:48 »
*zapomněl


JanS

Re:Python unit test: stdout testovaneho do souboru
« Odpověď #5 kdy: 30. 05. 2016, 12:38:03 »
Vypada, ze to funguje.
Deluji

Martin

Re:Python unit test: stdout testovaneho do souboru
« Odpověď #6 kdy: 30. 05. 2016, 16:03:12 »
Ještě je potřeba ošetřit výjimky - přidat finally, tak jak je to v příkladu na https://docs.python.org/2/library/contextlib.html#contextlib.closing. Jinak k navrácení původní stdout nedojde.

Kit

Re:Python unit test: stdout testovaneho do souboru
« Odpověď #7 kdy: 30. 05. 2016, 16:40:27 »
Citace od: JanS kdy 27. 05. 2016, 15:39:34
Zdravim,
pisu unit test funkce, ktera generuje kopec veci do stdout. Stdout vystup funkce chci presmerovat do souboru, ale vystupy testu nechat v stdout.
Nejake tipy?
Diky

Možná to zní jako divná rada, kterou však praktikuji: Ve funkcích nic neposílat do stdout.

gl

Re:Python unit test: stdout testovaneho do souboru
« Odpověď #8 kdy: 30. 05. 2016, 16:48:25 »
Citace od: Martin kdy 30. 05. 2016, 16:03:12
Ještě je potřeba ošetřit výjimky - přidat finally, tak jak je to v příkladu na https://docs.python.org/2/library/contextlib.html#contextlib.closing. Jinak k navrácení původní stdout nedojde.

Děkuji za upozornění


@contextmanager
def stdout(filename):
    with open(filename, 'a') as outfile:
        stdout_old = sys.stdout
        sys.stdout = outfile
        try:
            yield
        finally:
            sys.stdout = stdout_old

noef

  • *****
  • 897
Re:Python unit test: stdout testovaneho do souboru
« Odpověď #9 kdy: 01. 06. 2016, 07:03:35 »
Citace od: Kit kdy 30. 05. 2016, 16:40:27
Citace od: JanS kdy 27. 05. 2016, 15:39:34
Zdravim,
pisu unit test funkce, ktera generuje kopec veci do stdout. Stdout vystup funkce chci presmerovat do souboru, ale vystupy testu nechat v stdout.
Nejake tipy?
Diky

Možná to zní jako divná rada, kterou však praktikuji: Ve funkcích nic neposílat do stdout.

+1

Proc proste jen nepredat stream (nebo nejaky Python ekvivalent) jako parametr funkce?

BoneFlute

  • *****
  • 2 155
Re:Python unit test: stdout testovaneho do souboru
« Odpověď #10 kdy: 01. 06. 2016, 09:42:27 »
Citace od: noef kdy 01. 06. 2016, 07:03:35
Citace od: Kit kdy 30. 05. 2016, 16:40:27
Citace od: JanS kdy 27. 05. 2016, 15:39:34
Zdravim,
pisu unit test funkce, ktera generuje kopec veci do stdout. Stdout vystup funkce chci presmerovat do souboru, ale vystupy testu nechat v stdout.
Nejake tipy?
Diky

Možná to zní jako divná rada, kterou však praktikuji: Ve funkcích nic neposílat do stdout.

+1

Proc proste jen nepredat stream (nebo nejaky Python ekvivalent) jako parametr funkce?

Co je to za programátora, který tak nějak samozřejmě předpokládá, že může hrabat do zdrojáku?

gl

Re:Python unit test: stdout testovaneho do souboru
« Odpověď #11 kdy: 01. 06. 2016, 09:54:02 »
Citace od: BoneFlute kdy 01. 06. 2016, 09:42:27
Citace od: noef kdy 01. 06. 2016, 07:03:35
Citace od: Kit kdy 30. 05. 2016, 16:40:27
Citace od: JanS kdy 27. 05. 2016, 15:39:34
Zdravim,
pisu unit test funkce, ktera generuje kopec veci do stdout. Stdout vystup funkce chci presmerovat do souboru, ale vystupy testu nechat v stdout.
Nejake tipy?
Diky

Možná to zní jako divná rada, kterou však praktikuji: Ve funkcích nic neposílat do stdout.

+1

Proc proste jen nepredat stream (nebo nejaky Python ekvivalent) jako parametr funkce?

Co je to za programátora, který tak nějak samozřejmě předpokládá, že může hrabat do zdrojáku?

Nerozumím.

BoneFlute

  • *****
  • 2 155
Re:Python unit test: stdout testovaneho do souboru
« Odpověď #12 kdy: 01. 06. 2016, 10:00:19 »
Citace od: gl kdy 01. 06. 2016, 09:54:02
Citace od: BoneFlute kdy 01. 06. 2016, 09:42:27
Citace od: noef kdy 01. 06. 2016, 07:03:35
Citace od: Kit kdy 30. 05. 2016, 16:40:27
Citace od: JanS kdy 27. 05. 2016, 15:39:34
Zdravim,
pisu unit test funkce, ktera generuje kopec veci do stdout. Stdout vystup funkce chci presmerovat do souboru, ale vystupy testu nechat v stdout.
Nejake tipy?
Diky

Možná to zní jako divná rada, kterou však praktikuji: Ve funkcích nic neposílat do stdout.

+1

Proc proste jen nepredat stream (nebo nejaky Python ekvivalent) jako parametr funkce?

Co je to za programátora, který tak nějak samozřejmě předpokládá, že může hrabat do zdrojáku?

Nerozumím.
Mám-li funkci, která něco posílá do stdout, tak je rada "neposílat nic do stdout" poněkud knížecí.

noef

  • *****
  • 897
Re:Python unit test: stdout testovaneho do souboru
« Odpověď #13 kdy: 01. 06. 2016, 10:02:07 »
Citace od: BoneFlute kdy 01. 06. 2016, 09:42:27
Citace od: noef kdy 01. 06. 2016, 07:03:35
Citace od: Kit kdy 30. 05. 2016, 16:40:27
Citace od: JanS kdy 27. 05. 2016, 15:39:34
Zdravim,
pisu unit test funkce, ktera generuje kopec veci do stdout. Stdout vystup funkce chci presmerovat do souboru, ale vystupy testu nechat v stdout.
Nejake tipy?
Diky

Možná to zní jako divná rada, kterou však praktikuji: Ve funkcích nic neposílat do stdout.

+1

Proc proste jen nepredat stream (nebo nejaky Python ekvivalent) jako parametr funkce?

Co je to za programátora, který tak nějak samozřejmě předpokládá, že může hrabat do zdrojáku?

To jako testuju kod knihovny, do ktere nemuzu hrabat, nebo jak to mam chapat? Vetsinou se pisi unit testy pro kod vlastni tvorby. Pokud se takto chova nejaka knihovna pouzita v mem kodu, tak ji budto nahradim normalni alternativou (nepovazuji za normalni takto nevyzadane spamovat vystup), nebo to resim se zodpovednou osobou/firmou.

BoneFlute

  • *****
  • 2 155
Re:Python unit test: stdout testovaneho do souboru
« Odpověď #14 kdy: 01. 06. 2016, 10:09:05 »
Citace od: noef kdy 01. 06. 2016, 10:02:07
Citace od: BoneFlute kdy 01. 06. 2016, 09:42:27
Co je to za programátora, který tak nějak samozřejmě předpokládá, že může hrabat do zdrojáku?

To jako testuju kod knihovny, do ktere nemuzu hrabat, nebo jak to mam chapat? Vetsinou se pisi unit testy pro kod vlastni tvorby. Pokud se takto chova nejaka knihovna pouzita v mem kodu, tak ji budto nahradim normalni alternativou (nepovazuji za normalni takto nevyzadane spamovat vystup), nebo to resim se zodpovednou osobou/firmou.
Omlouvám se, beru zpět. V případě, že se jedná o unittesty, tak máš pravdu. (Nějak jsem si zvykl na Kitovo debilní komentáře, a tak jsem to přehlédl.)