Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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
-
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.
-
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
-
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
-
*zapomněl
-
Vypada, ze to funguje.
Deluji
-
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.
-
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.
-
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
-
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?
-
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?
-
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.
-
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í.
-
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.
-
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.)
-
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ě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?
-
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.
-
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ě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.