2017-09-05 14 views
1

Tclスクリプトで現在実行中のtcltesttestという名前を取得したいと思います。たとえば、次のコードは、テストの名前印刷するようになっている:実行中のtcltestテストの名前

#!/usr/bin/tclsh 
package require tcltest 

tcltest::test testFunction {} -body { 
    puts [lindex [info level 0] 0] 
    set a 1 
} -result 1 

をしかし、それは次のエラーを与える:

==== testFunction FAILED 
==== Contents of test case: 

    puts [lindex [info level 0] 0] 
    set a 1 

---- Test generated error; Return code was: 1 
---- Return code should have been one of: 0 2 
---- errorInfo: bad level "0" 
    while executing 
"info level 0" 
    ("uplevel" body line 2) 
    invoked from within 
"uplevel 1 $script" 
---- errorCode: TCL LOOKUP STACK_LEVEL 0 
==== testFunction FAILED 

任意のヘルプ、私がやっているいくつかの基本的な間違いがなければなりませんこれは非常に感謝しています。

+0

内省することによって、これを取得するためのユースケースは何ですか?良いテスト本体は知っている必要はありません(テンポラリファイルとディレクトリのためにtcltestに他の機能があるので、それらの名前は問題ではありません)。 –

+0

@DonalFellows:そうかもしれないが、イントロディスペンスはあまり役に立たないようだ。実際には、テストケースの名前を知る必要があります。なぜなら、テストケースの名前がパラメータになるレポートを生成したいからです。実際、テストスイートの実行から生成された複数のテストケース情報がレポートに含まれる可能性があります。テストケースの名前が頻繁に変更される可能性は低いので、名前をハードコードする方が良い選択肢です。 –

答えて

0

私はそのようなイントロスペクションを見つけることができませんでした。私は走っているテストを記録し、あるテストから別のテストへの移行をマークしたいので、私は見ました。

とにかくテスト名を知ることを止めるものはありません。

namespace eval ::testname { 
    variable name foo 
    variable major 1 
    variable minor 0 
    proc curname {} { 
     variable name 
     variable major 
     variable minor 
     return $name-$major.$minor 
    } 
} 

set ::testname::name testfunction 

::tcltest::test [::testname::curname] {} -body { 
    puts [::testname::curname] 
} -cleanup { 
    incr ::testname::minor 
} 

::tcltest::test [::testname::curname] {} -body { 
    puts [::testname::curname] 
} -cleanup { 
    incr ::testname::minor 
} 

または

oo::object create testname 
oo::objdefine testname { 
    variable name major minor 
    method init {nam {maj 1} {min 0}} { 
     set name $nam 
     set major $maj 
     set minor $min 
    } 
    method name val {set name $val} 
    method major val {set minor 0 ; set major $val} 
    method minor val {set minor $val} 
    method bump {} {incr minor} 
    method curname {} {return $name-$major.$minor} 
} 

testname init testfunction 

::tcltest::test [testname curname] {} -body { 
    puts [testname curname] 
} -cleanup { 
    testname bump 
} 

::tcltest::test [testname curname] {} -body { 
    puts [testname curname] 
} -cleanup { 
    testname bump 
} 

(これは、私が実際に使用していない何かを、コードを即興され、それが一度テストされ、少なくとも実行を行います。)

ドキュメント: create (method of oo::class)incrmethod (object configuration subcommand), namespace, oo::objdefine, oo::objectpackageprocputsreturnsettcltest (package)variable (object slot subcommand)variable

+0

私が書くテストでは、自動的に生成された名前は使用しません。これは、私がエラーを処理するときにgrepできるものとしてテスト名を使用できるようにしたいからです。 –

+0

@DonalFellows:それは基本的に私がそれらを使用しない理由です。私の答えで言及した場合、私は文字通りテスト名を繰り返すログ行を使い終わった。テスト名をイントロスペクトする機能は役に立ちました。 –

+0

@PeterLewerin:これは実際にテスト名の自動生成の良い例ですが、私はこのようなものを探しているとは言えません。私が見ているのは、テスト名のイントロスペクションの例ではなく、最初に名前を付けるために使用されたのと同じソースから名前をフェッチするようなものです。どちらの場所でも名前をハードコードするのと似ています(自動生成された名前は不要です)。これは私のシナリオにとって最も簡単な解決策です。 –

関連する問題