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.
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.
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
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?
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?
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.
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í.
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.
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.)
Citace od: BoneFlute 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.
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 :).
Citace od: BoneFlute kdy 01. 06. 2016, 10:09:05
(Nějak jsem si zvykl na Kitovo debilní komentáře, a tak jsem to přehlédl.)
;D
Citace od: BoneFlute kdy 01. 06. 2016, 10:09:05
(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?
Citace od: noef kdy 01. 06. 2016, 07:03:35
Citace od: Kit kdy 30. 05. 2016, 16:40:27
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.
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
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.
Citace od: Kit kdy 01. 06. 2016, 15:49:42
Citace od: BoneFlute kdy 01. 06. 2016, 10:09:05
(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.