(平台:Linux,特别是Fedora和Red Hat Enterprise Linux 6)
我有一个用Python编写的integration test来执行以下操作:
目前,最后一步失败是因为rsync正在创建文件,其所有权设置为apache用户的所有权,因此测试用例没有必要的权限来删除文件。
考虑到集成测试设置的情况,这个Server Fault question提供了一个很好的解释,说明清理步骤当前失败的原因。
我目前的做法:我只是不删除测试清理中的临时目录,因此这些集成测试会留下虚拟文件,需要手动清除/tmp
。
我目前正在考虑的主要解决方案是专门添加一个setuid脚本来处理测试套件的清理操作。这应该有效,但我希望其他人能提出更优雅的解决方案。具体来说,如果集成测试客户端不需要关心apache进程的uid,我真的很喜欢它。
我已经考虑但由于各种原因拒绝的方法:
我真正不想做的另一件事是更改传递给rsync的设置,以便测试套件可以正确清理临时目录。这是服务守护程序的集成测试,因此我希望尽可能使用配置尽可能接近生产。
答案 0 :(得分:1)
将测试用户添加到apache组(或httpd组,无论哪个文件具有组所有权)。
答案 1 :(得分:1)
在服务器故障问题的答案的帮助下,我能够使用setfacl
找出解决方案。
为集成测试创建临时目录的代码现在执行以下操作(它是unittest.TestCase
实例的一部分,因此引用addCleanup
):
local_path = tempfile.mkdtemp().decode("utf-8")
self.addCleanup(shutil.rmtree, local_path)
acl = "d:u:{0}:rwX".format(os.geteuid())
subprocess.check_call(["setfacl", "-m", acl, local_path])
前两行只是创建临时目录,并确保在测试结束时删除它。
最后两行是新部分,并设置目录的默认ACL,以便测试用户始终具有读/写访问权限,并且对具有执行位设置的任何内容也具有执行权限。