相关疑难解决方法(0)

在Python中使用代码存储库时如何引用资源的相对路径

我们正在使用一个代码存储库,它部署在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)

这是正确的方法吗?可能吗?

python path relative-path

179
推荐指数
5
解决办法
17万
查看次数

shell脚本的单元测试

几年来我所使用的每一件产品都涉及一定程度的shell脚本(或Windows上的批处理文件,PowerShell等).尽管我们用Java或C++编写了大量代码,但似乎总有一些集成或安装任务最好用shell脚本完成.

因此,shell脚本成为已发布代码的一部分,因此需要像编译代码一样进行测试.有没有人有过一些shell脚本单元测试框架的经验,比如shunit2?我现在主要对Linux shell脚本感兴趣; 我想知道测试工具如何复制其他xUnit框架的功能和易用性,以及与CruiseControl或Hudson等连续构建系统集成是多么容易.

linux shell scripting unit-testing

69
推荐指数
6
解决办法
5万
查看次数

从shell脚本导入函数

我有一个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)

shell

48
推荐指数
3
解决办法
4万
查看次数

Bash和测试驱动开发

在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 tdd

40
推荐指数
4
解决办法
1万
查看次数

测试bash shell脚本

有人可以解释如何测试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这样的代码来测试代码,从而得到所需的输出.

bash shell

9
推荐指数
3
解决办法
2万
查看次数

在Shell脚本中测试任何协议

是否有人在shell中看到过,试图实现或以其他方式使用TAP?我们正在寻找跨多种语言创建单元测试(不要让我开始为什么到目前为止还没有这个),而且由于我们有很多Perl代码,我们将会关注TAP(其中包括I)想像).我找到了一个用于C的TAP库,Perl,当然,内置它,我甚至找到了一个Java的API.但缺少的一个方面是shell脚本测试.

并非我在单元测试shell脚本上发现了很多,但由于我们确实有数千行shell代码,所以能够以某种方式测试它会很好.

shell unit-testing tap

5
推荐指数
2
解决办法
8635
查看次数

如何从python调用shell脚本函数/变量?

有没有办法调用shell脚本并使用python脚本中定义的函数/变量?

脚本是 unix_shell.sh

#!/bin/bash
function foo
{
...
}
Run Code Online (Sandbox Code Playgroud)

是否可以从python调用这个函数foo?

解决方案:

  1. 对于函数:将 Shell 函数转换为 python 函数
  2. 对于 shell 局部变量(非导出),在 shell 中运行此命令,就在调用 python 脚本之前:
    export $(set | tr '\n' ' ')

  3. 对于 shell 全局变量(从 shell 导出),在 python 中,您可以: import os print os.environ["VAR1"]

python bash

5
推荐指数
2
解决办法
7432
查看次数

标签 统计

shell ×4

bash ×3

python ×2

unit-testing ×2

linux ×1

path ×1

relative-path ×1

scripting ×1

tap ×1

tdd ×1