我们正在使用一个代码存储库,它部署在Windows和Linux上 - 有时在不同的目录上.项目中的一个模块应该如何引用项目中的一个非Python资源(CSV文件等)?
如果我们做类似的事情:
thefile=open('test.csv')
Run Code Online (Sandbox Code Playgroud)
要么:
thefile=open('../somedirectory/test.csv')
Run Code Online (Sandbox Code Playgroud)
仅当脚本从一个特定目录或目录的子集运行时,它才会起作用.
我想做的是:
path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?可能吗?
几年来我所使用的每一件产品都涉及一定程度的shell脚本(或Windows上的批处理文件,PowerShell等).尽管我们用Java或C++编写了大量代码,但似乎总有一些集成或安装任务最好用shell脚本完成.
因此,shell脚本成为已发布代码的一部分,因此需要像编译代码一样进行测试.有没有人有过一些shell脚本单元测试框架的经验,比如shunit2?我现在主要对Linux shell脚本感兴趣; 我想知道测试工具如何复制其他xUnit框架的功能和易用性,以及与CruiseControl或Hudson等连续构建系统集成是多么容易.
我有一个shell脚本,我想用shUnit测试.脚本(和所有功能)都在一个文件中,因为它使安装更容易.
示例 script.sh
#!/bin/sh
foo () { ... }
bar () { ... }
code
Run Code Online (Sandbox Code Playgroud)
我想编写第二个文件(不需要分发和安装)来测试中定义的函数 script.sh
就像是 run_tests.sh
#!/bin/sh
. script.sh
# Unit tests
Run Code Online (Sandbox Code Playgroud)
现在的问题在于.(或source在Bash中).它不仅解析函数定义,还执行脚本中的代码.
由于没有参数的脚本没有任何坏处,我可以
. script.sh > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
但如果有更好的方法来实现我的目标,我就会徘徊.
编辑
我建议的解决方法在源脚本调用的情况下不起作用,exit所以我必须捕获退出
#!/bin/sh
trap run_tests ERR EXIT
run_tests() {
...
}
. script.sh
Run Code Online (Sandbox Code Playgroud)
run_tests调用该函数但是只要我重定向source命令的输出,脚本中的函数就不会被解析,并且在陷阱处理程序中不可用
这有效,但我得到的输出script.sh:
#!/bin/sh
trap run_tests ERR EXIT
run_tests() {
function_defined_in_script_sh
}
. script.sh
Run Code Online (Sandbox Code Playgroud)
这不打印输出但是我得到一个错误,该函数未定义:
#!/bin/sh
trap run_tests ERR EXIT
run_tests() {
function_defined_in_script_sh
}
. script.sh …Run Code Online (Sandbox Code Playgroud) 在bash中编写多个简单的脚本时,我常常想知道如何使代码可测试.
通常很难为bash代码编写测试,因为它在获取值并返回值的函数上很少,而在检查和设置环境中的某些方面的函数中很高,修改文件系统,调用程序等 - 依赖于环境或具有副作用的功能.因此,设置和测试代码变得比它们测试的代码复杂得多.
例如,考虑一个简单的测试函数:
function add_to_file() {
local f=$1
cat >> $f
sort -u $f -o $f
}
Run Code Online (Sandbox Code Playgroud)
此功能的测试代码可能包括:
add_to_file.before:
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)
add_to_file.after:
bar
baz
foo
qux
Run Code Online (Sandbox Code Playgroud)
和测试代码:
function test_add_to_file() {
cp add_to_file.{before,tmp}
add_to_file add_to_file.tmp
cmp add_to_file.{tmp,after} && echo pass || echo fail
rm add_to_file.tmp
}
Run Code Online (Sandbox Code Playgroud)
这里有5行代码由6行测试代码和7行数据测试.
现在考虑一个稍微复杂的案例:
function distribute() {
local file=$1 ; shift
local hosts=( "$@" )
for host in "${hosts[@]}" ; do
rsync -ae ssh $file $host:$file
done
}
Run Code Online (Sandbox Code Playgroud)
我甚至不能说如何开始为此测试...
那么,有一个很好的方法在bash脚本中做TDD,还是我应该放弃并把我的努力放在别的地方?
有人可以解释如何测试bash shell脚本吗?
例如,我有一个包含此代码的.sh文件...
#!/bin/sh
for file in *.txt; do
mv "$file" "`basename $file .txt`.doc"
done
Run Code Online (Sandbox Code Playgroud)
我该如何为它编写测试?就像在Java中一样,你有单元测试,你可以在其中编写像assertEquals这样的代码来测试代码,从而得到所需的输出.
是否有人在shell中看到过,试图实现或以其他方式使用TAP?我们正在寻找跨多种语言创建单元测试(不要让我开始为什么到目前为止还没有这个),而且由于我们有很多Perl代码,我们将会关注TAP(其中包括I)想像).我找到了一个用于C的TAP库,Perl,当然,内置它,我甚至找到了一个Java的API.但缺少的一个方面是shell脚本测试.
并非我在单元测试shell脚本上发现了很多,但由于我们确实有数千行shell代码,所以能够以某种方式测试它会很好.
有没有办法调用shell脚本并使用python脚本中定义的函数/变量?
脚本是 unix_shell.sh
#!/bin/bash
function foo
{
...
}
Run Code Online (Sandbox Code Playgroud)
是否可以从python调用这个函数foo?
解决方案:
对于 shell 局部变量(非导出),在 shell 中运行此命令,就在调用 python 脚本之前:
export $(set | tr '\n' ' ')
对于 shell 全局变量(从 shell 导出),在 python 中,您可以: import os print os.environ["VAR1"]