플라스/mongodb 웹 애플리케이션성 테스트
-
13-12-2019 - |
문제
나는 플라스크를 통합 테스트에 의해 백업됩 1-node mongodb 무작위로패:
pytest/test_webapi.py:59: in test_register_test
> assert res.status_code == 302
E assert <Response streamed [404 NOT FOUND]>.status_code == 302
실패 비율은 약 50%입니다.
테스트 test_webapi.py 보고서:
def test_register_user(self):
res = self.client.get("/logout")
class MySMTPServer(smtpd.SMTPServer):
mails = []
def process_message(self, peer, mailfrom, rcpttos, data):
self.mails.append((rcpttos[0], data))
server = MySMTPServer(('localhost', 12345), None)
t = threading.Thread(target=asyncore.loop, args=(1,))
t.start()
time.sleep(.1)
try:
res = self.client.post("/register", data=self.registration)
assert res.status_code == 200
mail, hash = server.mails[0]
self.conn.fsync()
time.sleep(.1)
res = self.client.get('/activate/' + hash)
assert res.status_code == 302
finally:
server.close()
관련 플라스크에서 방법 webapi.py:
@app.route("/register", methods=["POST"])
def register_user():
mail = flask.request.form['mail']
user = flask.request.form["user"]
pw = flask.request.form["pass"]
hash = users.register(user, pw, mail=mail)
return flask.jsonify({'_id': None}) # XXX
@app.route('/activate/<hash>', methods=['GET'])
def activate_user(hash):
key = users.activate(hash=hash)
if not key:
flask.abort(404)
return flask.redirect("/")
...지원여 작업 방법:
make_key = lambda : base64.encodestring(os.urandom(32)).strip()
def register(self, user, pw, **kw):
hash = self.make_key()
user = self.new(user, pw, activation=hash, **kw)
self._send_mail(**user)
return hash
def activate(self, hash):
user = self.users.find_one({'activation': hash})
if not user:
return None
key = self.make_key()
activation = {
'$unset': {'activation': 1},
'$set': {'status': 'active', 'key': key} }
self.users.update({'_id': user['_id']}, activation)
return user
...어디에 자체입니다.사용자는 mongodb 컬렉션입니다.
자체입니다.new()지속 엔터티를 사용하여 안전=True.
흥미롭게도,다른 여러 가지 테스트 하는 유사한 것을 결코가 발생할 것이 문제입니다.
생각이 있었다는 것이 충분한지 확인하는 유체에게는 보이지 않을 것이 다른 스레드에서 pymongo 연결 수영장도 있습니다.의 어떤 부분 mongodb/pymongo 문서 읽었으니다.또는 몇 가지 이상의 상호 작용 asyncore?
해결책
(이식에서 의견이 스레드)
의 컨텍스트에서 테스트,가 data
가 base64 인코딩된 문자열의 활성화 열쇠?base64 포함한 문자와 숫자이지만,또한"+"and"/",모두의는 것이 잘못 해석하여 URL 을 파서(특히"/").
제휴하지 않습니다 StackOverflow