【问题标题】:how to run expect script on a given spawn id如何在给定的生成 id 上运行期望脚本
【发布时间】:2020-01-13 19:55:40
【问题描述】:

如何从第一个期望脚本在 spawnid 上运行一堆期望脚本

以下是详细信息: 我首先期望脚本会生成一个名为 openapp 的应用程序。 现在我想运行测试(用期望脚本编写 - abc),它将对生成的应用程序 ID 进行不同的验证

#!/usr/bin/expect -f
source home/tests/library.tcl
set openapp [runapp]
eval spawn $openapp
set id $spawn_id
login
puts [exec home/tests/testsuite/abc $id]
expect eof

#!/usr/bin/expect -f
sourcehome/tests/library.tcl
puts 2ndscript
set bbb [lindex $argv 0]
puts $bbb
send -i $bbb "t\r"
expect eof


这是我得到的结果:

exp5 第二稿 经验5 找不到名为“exp5”的频道 在执行时 "发送 -i $bbb "t\r"" (文件“/home/tests/testsuite/abc”第 6 行) 在执行时 “执行主页/测试/测试套件/abc $id” 从内部调用 “将 [exec home/tests/testsuite/abc $id]” (文件“/home/tests/testsuites/xyz”第 7 行)

我无法从其他脚本对 spawnid 运行期望命令

【问题讨论】:

  • expect eof 之后的第一个脚本中,生成的进程已经死亡,因此无法继续与其交互。
  • 即使你没有expect eof,当期望脚本完成时,生成的进程也会被杀死(通常被SIGHUP)。您不能将 spawnid 从一个脚本传递到另一个脚本。
  • 感谢 pynexj,所以除了将 spawnid 从一个脚本传递到另一个脚本之外,还有其他方法可以在一个期望脚本中生成应用程序后调用其他期望脚本。所以基本上,我必须生成一个应用程序并登录,然后我想运行一些测试。因此,为了便于维护,这些测试必须在不同的文件中,而不是在我们生成应用程序的同一个文件中。

标签: tcl expect


【解决方案1】:

Spawn ID 对于特定脚本来说完全是本地的;它们甚至无法有效地发送到同一进程中的另一个线程(将它们发送回原始脚本除外)。

您需要在您的第二个文件中编写您的代码作为将生成 ID 作为参数的过程。

proc do_the_thing {id} {
    send -i $id "t\r"
}

然后你可以source从第一个程序开始,让它做你想做的事:

#!/usr/bin/expect -f

source home/tests/library.tcl
eval spawn [runapp]
login
source secondscript.tcl
do_the_thing $spawn_id
expect eof

如果您希望其他脚本也可以独立调用,您可以:

#!/usr/bin/expect -f

proc do_the_thing {id} {
    send -i $id "t\r"
}

# This is how you check if this script is the main script
if {$::argv0 eq [info script]} {
    # This is main; do our thing...
    source home/tests/library.tcl
    set bbb [spawn ...]
    puts $bbb
    do_the_thing $bbb
    expect eof
}

【讨论】:

  • 非常感谢多纳尔。这正是我目前的做法,将其他测试称为 proc,然后在基类中获取它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
相关资源
最近更新 更多