Funkload与cookies

1 投票
2 回答
1364 浏览
提问于 2025-04-16 19:43

我在设置funkload时遇到了一些麻烦,特别是关于cookie的部分。我开启了fl-record,然后进行了一系列请求,每个请求都发送了一个cookie。如果我不指定文件夹路径直接运行命令,输出会以TCPWatch-Proxy的格式保存,这样我就能看到所有cookie的内容,所以我知道它们确实被发送了。

比如,这就是watch0003.request的内容:

GET http://mydomainnamehere.pl/api/world/me/ HTTP/1.1
Host: mydomainnamehere.pl
Proxy-Connection: keep-alive
Referer: http://mydomainnamehere.pl/test/engine/
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.57 Safari/534.24
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pl,en-US;q=0.8,en;q=0.6,fr-FR;q=0.4,fr;q=0.2
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: Beacon-ClientID=<<<some-beaconpush-id-here>>>; sessionid=<<<some-session-id>>>; fbs_<<<some-facebook-id>>>="access_token=<<<some-access-token>>>&expires=1308254400&secret=<<<some-secret>>>&session_key=<<<some-session-key>>>&sig=<<<some-signature>>>&uid=<<<some-user-id>>>"; Beacon-Preferred-Client=WebSocket

但是如果我用测试案例的名字来运行fl-record,这样funkload就会把输出存储为一个python测试文件,所有的cookie都没有被记录下来。代码里根本没有任何关于cookie的内容:

import unittest
from funkload.FunkLoadTestCase import FunkLoadTestCase
from webunit.utility import Upload
from funkload.utils import Data
#from funkload.utils import xmlrpc_get_credential

class Simple(FunkLoadTestCase):

    def setUp(self):
        """Setting up test."""
        self.logd("setUp")
        self.server_url = self.conf_get('main', 'url')
        # XXX here you can setup the credential access like this
        # credential_host = self.conf_get('credential', 'host')
        # credential_port = self.conf_getInt('credential', 'port')
        # self.login, self.password = xmlrpc_get_credential(credential_host,
        #                                                   credential_port,
        # XXX replace with a valid group
        #                                                   'members')

    def test_simple(self):
        # The description should be set in the configuration file
        server_url = self.server_url
        # begin of test ---------------------------------------------

        ...

        # /tmp/tmp5Nv5lW_funkload/watch0003.request
        self.get(server_url + "/api/world/me/",
                 description="Get /api/world/me/")

        ...

        # end of test -----------------------------------------------

    def tearDown(self):
        """Setting up test."""
        self.logd("tearDown.\n")

if __name__ in ('main', '__main__'):
    unittest.main()

还有一个配置文件,但里面也没有关于cookie的内容。

另一方面,文档里说fl是支持cookie的。我还发现之前的版本中有一些关于cookie支持的bug修复,所以我可以推测这不是空话。我在更新日志中也看到提到“已删除的cookie”不会包含在输出中。这让我想,也许问题在于这些cookie在记录时被标记为删除,或者在从TCP-Watch格式转换为实际测试用例时被fl识别为删除。这只是我的一个猜测。

我想知道:

  • 你是否在使用funkload支持cookie方面有过成功的经验?如果有,你用的是哪个版本。
  • 你对funkload的整体体验如何,是否值得在更复杂的设置中使用。

编辑

显然,有些被记录的请求完全被忽略,没有包含在输出的测试案例中。有人知道为什么会这样吗?这和重定向有关吗?

编辑(2)

好的,确实有关系。这一点其实是有道理的。它会省略重定向的结果,因为这些结果会通过简单地跟随HTTP 302 Found来生成。不过关于cookie的问题仍然没有解释清楚。

2 个回答

0

我发现了Funkload中的一个bug。Funkload没有正确处理域名以“.”开头的cookies。目前,这些cookies都被悄悄地忽略了。

可以查看这个分支: https://github.com/sbook/FunkLoad

我已经提交了一个拉取请求: https://github.com/nuxeo/FunkLoad/pull/32

1

我看到这个老帖子没有人回答,所以我想我可以来分享一下:

在Python中:首先要确定你要发送的cookie的名称。我的cookie名称是'csrftoken',在请求头中是这个名字,而在发送的数据中则是'csrfmiddlewaretoken'。最开始我会获取这个cookie的值,然后在发送请求时把它放进去用来验证身份。举个例子:

    res = self.get ( server_url + '/login/', description = 'Get url' ).cookies.itervalues ( ).next ( )
    morsel_str = res [ '/' ] [ 'csrftoken' ]
    csrftoken = morsel_str.value
    # Once Cookie found include it in params
    params = [
        [ 'csrfmiddlewaretoken', csrftoken ],
        [ 'username', 'username..' ],
        [ 'password', '********' ] ]
    self.setHeader ( 'cookie', 'csrftoken={0}'.format ( csrftoken ) )
    resp = self.post ( server_url + '/login/', params, description = "Post /login/" )

撰写回答