4

単体テスト中に、生成されたURLをテストで定義された静的URLと比較したいと思います。この比較では、TestCase.assertURLEqualまたは同様のものを使用すると、2つのURLを文字列形式で比較でき、すべてのクエリコンポーネントとフラグメントコンポーネントが存在し、等しいが、必ずしも順番に並んでいない場合はTrueになります。

これを自分で実装する前に、この機能はすでに使用されていますか?

4

2 に答える 2

1

これは、標準ライブラリのurlparseを使用して実装するのはそれほど難しくありません。

from urlparse import urlparse, parse_qs


def urlEq(url1, url2):
      pr1 = urlparse(url1)
      pr2 = urlparse(url2)
      return (pr1.scheme == pr2.scheme and
              pr1.netloc == pr2.netloc and
              pr1.path == pr2.path and
              parse_qs(pr1.query) == parse_qs(pr2.query))

# Prints True  
print urlEq("http://foo.com/blah?bar=1&foo=2", "http://foo.com/blah?foo=2&bar=1")
# Prints False
print urlEq("http://foo.com/blah?bar=1&foo=2", "http://foo.com/blah?foo=4&bar=1")

基本的に、URL から解析されたすべてのものを比較しますが、parse_qs を使用してクエリ文字列から辞書を取得します。

于 2012-10-25T20:33:00.313 に答える
1

組み込みのものがあるかどうかはわかりませんがurlparse、デフォルトで順序が考慮されるため、クエリパラメーターを使用して自分で確認するだけで済みます。

>>> import urlparse
>>> url1 = 'http://google.com/?a=1&b=2'
>>> url2 = 'http://google.com/?b=2&a=1'
>>> # parse url ignoring query params order
... def parse_url(url):
...   u = urlparse.urlparse(url)
...   q = u.query
...   u = urlparse.urlparse(u.geturl().replace(q, ''))
...   return (u, urlparse.parse_qs(q))
... 
>>> parse_url(url1)
(ParseResult(scheme='http', netloc='google.com', path='/', params='', query='', fragment=''), {'a': ['1'], 'b': ['2']})
>>> def assert_url_equals(url1, url2):
...   return parse_url(url1) == parse_url(url1)
...
>>> assert_url_equals(url1, url2)
True
于 2012-10-25T20:33:25.663 に答える