Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: JanS 27. 05. 2016, 15:39:34

Název: Python unit test: stdout testovaneho do souboru
Přispěvatel: JanS 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
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: gl 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.
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: gl 27. 05. 2016, 17:34:05
Kód: [Vybrat]
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

Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: gl 27. 05. 2016, 17:48:37
Zapoměl jsem return. Mělo to být:

Kód: [Vybrat]
def redirect_stdout(f, filename):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        with stdout(filename):
            return f(*args, **kwargs)
    return wrapper
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: gl 27. 05. 2016, 18:19:48
*zapomněl
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: JanS 30. 05. 2016, 12:38:03
Vypada, ze to funguje.
Deluji
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: Martin 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.
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: Kit 30. 05. 2016, 16:40:27
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.
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: gl 30. 05. 2016, 16:48:25
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í

Kód: [Vybrat]
@contextmanager
def stdout(filename):
    with open(filename, 'a') as outfile:
        stdout_old = sys.stdout
        sys.stdout = outfile
        try:
            yield
        finally:
            sys.stdout = stdout_old
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: noef 01. 06. 2016, 07:03:35
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?
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: BoneFlute 01. 06. 2016, 09:42:27
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?
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: gl 01. 06. 2016, 09:54:02
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.
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: BoneFlute 01. 06. 2016, 10:00:19
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í.
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: noef 01. 06. 2016, 10:02:07
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.
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: BoneFlute 01. 06. 2016, 10:09:05
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.)
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: noef 01. 06. 2016, 13:01:33
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.

To nic - jsem trochu znejistel. Jsem prece jen v tomto celkem novy a ten vyrok me prisel nelogicky. Bohuzel asi ne vzdy ma vyvojar "luxus" v podobe volby knihovny. U nejakych specializovanych veci bych se nedivil, kdyby funkcnosti vyhovovala prave jedna a podle te se holt bude muset i cela aplikace a testy ohybat. Jsem rad, ze delam s dost main-stream vecmi, takze takoveto problemy nepotkavam :).

(Nějak jsem si zvykl na Kitovo debilní komentáře, a tak jsem to přehlédl.)

 ;D
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: Kit 01. 06. 2016, 15:49:42
(Nějak jsem si zvykl na Kitovo debilní komentáře, a tak jsem to přehlédl.)

Opět ad hominem? To už ti tase došly argumenty?
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: gl 01. 06. 2016, 16:25:26
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?

Další možnost je tu funkci napsat jako generátor a návratovou hodnotu řešit pomocí výjimek. O výpis se postará volající funkce, která může být také generátor atd. Ten výstup se potom bude snáz testovat.
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: BoneFlute 01. 06. 2016, 21:44:40
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

stdout je obecný soubor. Myslím, že by mohlo stačit když by si předal handle na soubor, do kterého má funkce zapisovat.
Název: Re:Python unit test: stdout testovaneho do souboru
Přispěvatel: BoneFlute 01. 06. 2016, 21:46:36
(Nějak jsem si zvykl na Kitovo debilní komentáře, a tak jsem to přehlédl.)

Opět ad hominem? To už ti tase došly argumenty?

Ad hominem by bylo: "na debilního Kita" - sorry, že tě musím zase opravovat.