Почему бы просто не издеваться над сайтом , который возвращает ожидаемый ответ? затем запустить сервер в потоке в настройке и убить его в демонтаже. Я закончил тем, что сделал это для тестирования кода, который отправлял бы электронную почту, издеваясь над SMTP-сервером, и это прекрасно работает. Конечно, что-то более тривиальное можно сделать для http ...
from smtpd import SMTPServer
from time import sleep
import asyncore
SMTP_PORT = 6544
class MockSMTPServer(SMTPServer):
def __init__(self, localaddr, remoteaddr, cb = None):
self.cb = cb
SMTPServer.__init__(self, localaddr, remoteaddr)
def process_message(self, peer, mailfrom, rcpttos, data):
print (peer, mailfrom, rcpttos, data)
if self.cb:
self.cb(peer, mailfrom, rcpttos, data)
self.close()
def start_smtp(cb, port=SMTP_PORT):
def smtp_thread():
_smtp = MockSMTPServer(("127.0.0.1", port), (None, 0), cb)
asyncore.loop()
return Thread(None, smtp_thread)
def test_stuff():
#.......snip noise
email_result = None
def email_back(*args):
email_result = args
t = start_smtp(email_back)
t.start()
sleep(1)
res.form["email"]= self.admin_email
res = res.form.submit()
assert res.status_int == 302,"should've redirected"
sleep(1)
assert email_result is not None, "didn't get an email"
Какое распределение отклонений вы хотите?
Вот метод, который всегда работает, но не всегда самый эффективный. Кумулятивная функция распределения P (x) дает долю времени, в течение которой значения падают ниже x. Таким образом, P (x) = 0 при наименьшем возможном значении x и P (x) = 1 при максимально возможном значении x. У каждого распределения есть уникальная функция CDF, которая кодирует все свойства распределения таким образом, что P (x) возрастает от 0 до 1. Если y - равномерное отклонение на интервале [0,1], тогда x, удовлетворяющий P (x) = y, будет распределен согласно вашему распределению. Чтобы сделать эту работу удобной, вам просто нужен способ вычисления обратной величины P (x) для вашего дистрибутива.
Библиотека Meta.Numerics определяет большое количество обычно используемых искажений (например, нормальное, логнормальное , экспоненциальный, хи-квадрат и т. д.) и имеет функции для вычисления CDF (Distribution.LeftProbability) и обратного CDF (Distribution.InverseLeftProbability) каждого из них.
Для специализированных методов, которые являются быстрыми для определенных распределений, например Box- Технику Мюллера для нормально распределенных отклонений см. В книге Числовые рецепты.
Попробуйте сгенерировать равномерно распределенные случайные числа, а затем примените инвертированную неравномерную кумулятивную функцию распределения к каждому из них.
Если вы используете Java, то моя библиотека Uncommons Maths может быть интересна. Он включает классы для генерации случайных чисел для равномерного, гауссовского, пуассоновского, биномиального и экспоненциального распределений. В этой статье показано, как можно использовать эти дистрибутивы.