Russian Qt Forum

Qt => Общие вопросы => Тема начата: ІГРОГРАЙКО от Апрель 24, 2013, 17:19



Название: Помогите написать тест!
Отправлено: ІГРОГРАЙКО от Апрель 24, 2013, 17:19
Не могу никак придумать тест.

надо протестировать класс, экземпляр которого являет собой закачку (DownloadMember).
у класса есть всего 3 публичных метода:
Код:
    void startDownloading();
    void pauseDownloading();
    void deleteDownload();
и много Get-методов:
Код:
    int getState() const;
    QString getFileName() const;
    QString getDestination() const;
    qint64 getSpeed() const;
    qint64 getFileSize() const;
    QTime getTimeToFinish() const;
    qreal getProgress() const;

Проблема для меня заключается в том что я не знаю как подготовить екземпляр класса для тестирования на нем одного с 3-ех методов (void startDownloading(); например)
мой тест выглядит так:
Код:
void TestDownloadManager::downloadMember_startDownloading_Test()
{
    DownloadMember downloadMember = DownloadMember("http://test.txt", QDir::currentPath());
    downloadMember.startDownloading();

    QVERIFY(downloadMember.getState() == DownloadMember::Downloading);
}
но он никогда не будет работать потому, что конструктор DownloadMember требует реального URL, потому, что делает проверку сразу в конструкторе.
Правильно будет переопределить конструктор DownloadMember? Что для этого надо?

Вот код конструктора:
Код:
DownloadMember::DownloadMember(const QString &sourceURL, const QString &directory, QObject *parent) :
    QObject(parent)
{
    QUrl source = QUrl(sourceURL);
    fileName = source.path().split('/').last();
    destination = directory;
    timeToFinish = QTime();
    PART_SIZE = 4000000;
    bytesDownloaded = 0;
    currentPartSize = 0;
    fileSize = 0;
    progress = 0;
    speed = 0;
    currentState = NotReady;

    sender = QSharedPointer<Sender>(new Sender(source,this));
    speedCounter = QSharedPointer<SpeedCounter>(new SpeedCounter(this));

    connect(sender.data(), SIGNAL(newReply(QNetworkReply*)), SLOT(replyRecivingStarted(QNetworkReply*)));
    connect(speedCounter.data(), SIGNAL(speedChanged(qint64)), SLOT(speedChanged(qint64)));

    sender->getDownloadInfo();

    qDebug() << "(DownloadMember)Initialisation - completted";
}


Название: Re: Помогите написать тест!
Отправлено: mutineer от Апрель 24, 2013, 17:25
А где в конструкторе проверка?


Название: Re: Помогите написать тест!
Отправлено: ІГРОГРАЙКО от Апрель 24, 2013, 17:33
Код:
sender->getDownloadInfo();
Отправляет HEAD запрос по заданному URL. А потом коннект:
Код:
connect(sender.data(), SIGNAL(newReply(QNetworkReply*)), SLOT(replyRecivingStarted(QNetworkReply*)));
передает реплай в приватный слот класа, ну и там где то вылетает:
Код:
error(QNetworkReply::NetworkError)
после такого startDownloading() не сможет запустить закачку... :(


Название: Re: Помогите написать тест!
Отправлено: ІГРОГРАЙКО от Апрель 24, 2013, 17:38
Кстати!
Сам метод startDownloading() выглядит так:
Код:
void DownloadMember::startDownloading()
{
    switch(currentState)
    {
    case NotReady:
        connect(this, SIGNAL(downloadIsReady()), SLOT(startDownloading()));
        return;
    case ReadyToStart:
        beginDownloading();
        return;
    case Pause:
        beginDownloading();
        return;
    default:
        qDebug() << "Unknown state...";
        return;
    }
}

и beginDownloading()
Код:
void DownloadMember::beginDownloading()
{
    sender->download("bytes=" + QByteArray::number(parts[0]) + "-" + QByteArray::number(parts[1]-1));
    speedCounter->start();
    currentState = Downloading;
    emit downloadDataChanged();
}


Название: Re: Помогите написать тест!
Отправлено: mutineer от Апрель 24, 2013, 17:58
Чтобы нормально оттестировать это класс, имхо, придется понимать локальный сервер


Название: Re: Помогите написать тест!
Отправлено: ІГРОГРАЙКО от Апрель 24, 2013, 18:12
ииииии...)
Не думаю что это хорошая идея запускать локал сервер...)

Наверное лучше будет перенести проверку в сам метод startDownloading()... Типа забарать с конструктора sender->getDownloadInfo(); и вставить его в:
Код:
void DownloadMember::startDownloading()
{
    switch(currentState)
    {
    case NotReady:
        // -УДАЛИТЬ!- connect(this, SIGNAL(downloadIsReady()), SLOT(startDownloading()));
        sender->getDownloadInfo();
        return;
    case ReadyToStart:
        beginDownloading();
        return;
    case Pause:
        beginDownloading();
        return;
    default:
        qDebug() << "Unknown state...";
        return;
    }
}


Название: Re: Помогите написать тест!
Отправлено: mutineer от Апрель 24, 2013, 18:24
Так тебе надо протестить существующий класс или переписать его?


Название: Re: Помогите написать тест!
Отправлено: ІГРОГРАЙКО от Апрель 24, 2013, 18:40
Мне нужно написать тесты для класса. Но можно переделать некоторые места для того чтобы было легче написать тесты...


Название: Re: Помогите написать тест!
Отправлено: mutineer от Апрель 25, 2013, 11:28
Так а что даст перенос проверки в другой метод? Все равно без реального URL класс не пройдет тест


Название: Re: Помогите написать тест!
Отправлено: ІГРОГРАЙКО от Апрель 25, 2013, 12:05
НУ походу тестирование метода startDownloading() можно понимать не как получение валидного ответа с сервера, а как мок, то есть вызов Qt-шного метода:
Код:
QNetworkAccessManager::get()
Ведь нет смысла тестировать результат Qt-шного метода? Он 100% работает должным образом...