Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> система автоматического тестирования прогрраммы 
:(
    Опции темы
KuMa1104
Дата 11.12.2009, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



Здравствуйте.
Недавно написал небольшую программу. 
Там всегото происходит html  разметка С#  кода и потом его расскраска.

Но  в целях обучения мне сказали что, нужно создать для неё с-му автоматического тестирования.
И сделать поскорее.

Как это сделать с чего начать?
Я почитал в нете но всё равно я несовсем предстовляю как это должно выглядеть.


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Ram1reS
Дата 11.12.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 25.4.2008
Где: Москва

Репутация: 3
Всего: 5



Читайте про Unit Test'ы, для начала тут и тут.
Инструментарий, например, NUnit (офф. сайт) или встроенные тесты студии.

Пример с NUnit.org:
Класс:
Код

namespace bank
{
  public class Account
  {
    private float balance;
    public void Deposit(float amount)
    {
      balance+=amount;
    }

    public void Withdraw(float amount)
    {
      balance-=amount;
    }

    public void TransferFunds(Account destination, float amount)
    {
        destination.Deposit(amount);
    Withdraw(amount);
    }

    public float Balance
    {
      get{ return balance;}
    }
  }
}


Тест к нему:
Код

namespace bank
{
  using NUnit.Framework;

  [TestFixture]
  public class AccountTest
  {
    [Test]
    public void TransferFunds()
    {
      Account source = new Account();
      source.Deposit(200.00F);
      Account destination = new Account();
      destination.Deposit(150.00F);

      source.TransferFunds(destination, 100.00F);
      Assert.AreEqual(250.00F, destination.Balance);
      Assert.AreEqual(100.00F, source.Balance);
    
    }
  }
}



Это сообщение отредактировал(а) Ram1reS - 11.12.2009, 10:24
--------------------
 
PM MAIL ICQ   Вверх
Heinzz
Дата 11.12.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



в профессиональной студии есть вазможность создания тестов


--------------------
user posted image
PM MAIL   Вверх
ДобренькийПапаша
Дата 11.12.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



Я тут так подумал. Конечно, юнит-тесты нужная вещь, но если пишешь что-то относительно больше в одно лицо и нужно быстрее разработать, то если ещё и юнит-тесты ко всем функциям писать, то кодить сутками придётся)))))

Конечно, на меня можно напасть, сказав, что благодаря юнит-тестам разработка пойдёт быстрее, ибо времени на отладку уйдёт меньше и вообще всё прочее-прочее. Но думаю, это не всегда так. И в каждом отдельном случае надо думать, а нужен ли мне юнит-тест? 

Думается, в критических местах использование тестов уместно.


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
KuMa1104
Дата 11.12.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



спасибо всем.
Почитал про  NUnit, вроде понял.
Буду пробовать.

Ram1reS отдельное спасибо++


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
gwi52
Дата 11.12.2009, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Всем привет!

Всегда знал, что системное тестирование необходимо, но руки не доходили.
Совсем недавно наконец-то руки дошли - всем очень рекомендую заняться, не откладывая.
Открывается даже то, о чем и не гадал, философия да и только.
Тестирую  просто - см. код.
Образцов много, даже самые невероятные.
В результате тестирования и доработки получаю очень устойчивый код.
Буду очень признателен за критику.

Код

public class myClass   // Тестируемый класс
{ public    myClass       (int a, int b, int c )    { A=a; B=b; C=c;    }
  public    int    A,B,C;
  public    int    Action (int D, int E, int F )    { return A+B+C+D+E+F;    }
}
public class tester
{ myClass My=new myClass(1,2,3);
  List<string> S;    string [] s; int i;
  public void Test    ()    
  { S=new List<string>();    
//              D    E    F    Result
     S.Add    ("1    2    3    12");             // Тестовые образцы
     S.Add    ("2    3    4    15");
     for  (i=0;i<S.Count;i++)
     { s=S[i].Split('    ');
       int I=My.Action (Convert.ToInt32(s[0]),Convert.ToInt32(s[1]),Convert.ToInt32(s[2]));
       if  (I!=Convert.ToInt32(s[3])) MessageBox.Show("myClass.Action", "Error");
     }
} }

PM MAIL   Вверх
ДобренькийПапаша
Дата 11.12.2009, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



Вроде нормально, только один вопрос. Вы этот код специально нечитабельным сделали? Такое ощущение что кодили в старом добром блокноте)))


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
gwi52
Дата 11.12.2009, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Сорри.
Это с непривычки.
На самом деле очень удобно и читабельно.

PM MAIL   Вверх
gwi52
Дата 11.12.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



P.S. Добренькому папаше.

Есть большие программы, которые пишутся "в одно лицо" и на всю оставшуюся жизнь.
В таких программах устойчивость кода особенно важна.
Давние скрытые ошибки или, правильнее, неточности - для меня всегда мучение.
Лучше бы отсечь их в начале.
Хотя понятно, что нет такой программы, в которой нет хотя бы еще одной ошибки.
PM MAIL   Вверх
DenWPF
Дата 11.12.2009, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



да ладно вам. есть программы в которых уже нету ошибок...

PM MAIL   Вверх
gwi52
Дата 11.12.2009, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



сомневаюсь, не видел таких программ...
PM MAIL   Вверх
Exai1e
Дата 11.12.2009, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: 3
Всего: 30



gwi52, имхо: ну мб и дело привычки, но такой код сложно читаем) и не подходит не под какие стандарты)


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
gwi52
Дата 11.12.2009, 20:11 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



"...зри в корень...", а не на форму...
когда мне приходится разбирать чужой код, я всегда привожу его к удобному для себя виду...
PM MAIL   Вверх
DenWPF
Дата 11.12.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



парень не смей такое делать...
ну по крайне мере в команде такое делать нельзя.
лучше учись воспринимать любой вид.
PM MAIL   Вверх
gwi52
Дата 11.12.2009, 20:43 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Согласен, в серьезной команде должен быть стандарт.
Но разбирать иногда приходится такое, что ни в какие стандарты не укладывается.
Пишут вроде серьезные люди, в серьезных фирмах, очень серьезных...
Но сами же признают, что работает не весь код, и поэтому, вот вам код - кувыркайтесь как хотите.
И разобрать этот код без манипуляций над ним нет никакой возможности, поверьте мне.
Более того я знаю многих хороших программеров, которые форматируют тексты.

Так что, безусловно, правила нужны, но не догмы.

У меня в практике бывали случаи, когда только форматированием я добивался понимания, а затем и оптимизации, в результате которой программа начинала работать в 100 (сто) раз быстрее.
PM MAIL   Вверх
ДобренькийПапаша
Дата 11.12.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



Хорош бредить, тот код, который вы привели полное ###. Вам на это указали. Форматирование и именование производиться в соответствии со спецификацией, а не как моей задней левой вздумается.

Серьёзные люди такого не пишут. 


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
gwi52
Дата 11.12.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Это нервы...
"... учись воспринимать любой вид ..." DenWPF
Уже не интересно...
Гуд бай !
PM MAIL   Вверх
KuMa1104
Дата 12.12.2009, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



Хм...
Да интерестный вышел спор.

Но мне интересно, как вы считаете 
когда нужно применять тестирование, а когда можно обойтись без него?

На ваш взгляд, есть ли некое универсальное правило?
Применяем в этих случаях и не требуется в этих.




Это сообщение отредактировал(а) KuMa1104 - 12.12.2009, 00:39


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Exai1e
Дата 12.12.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: 3
Всего: 30



будет ли желание приводить к примеру такой код к "нужному виду" (тут изменено только форматирование, без использования ужасных имен переменных)
Код

using System;using System.Collections.Generic;
using System.Text;using System.IO;using System.Runtime.Serialization.Formatters.Binary;

namespace TSACore
{
    #region QuestionExceptionClasses    public class QuestionFoundException : 
ApplicationException    {
        public QuestionFoundException(string pMessage) :
            base(pMessage) {}
    }

    public class QuestionNotFoundException : ApplicationException
    {        public QuestionNotFoundException(string pMessage) :
            base(pMessage) 

}
    }

    public class ParamsNotCorrectException : 
ApplicationException
    {
        public ParamsNotCorrectException(string pMessage) :
            base(pMessage) 

}
    }

    #endregion

    [Serializable]
    public class CurrentTest    {
        //Название теста
        public string TestName {
 set; get;
 }

        //Список вопросов
        private List<Question> questionList = new List<Question>();

        //Сортировка номеров вопросов
        private void SortQuestionList()        {
            for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                questionList[questionIndex].QuestionIndex = questionIndex;        }

        //Получение общего чиста вопросов
        public int GetQuestionCount()        {




            return questionList.Count;
        }

        //Получение списка ответов (заголовки)
        public List<string> GetCaptionQuestionList()


   {
            List<string> _returnValue = new List<string>();
            foreach (Question curQuestion in questionList)


                _returnValue.Add(curQuestion.QuestionCaption);

            return _returnValue;
        }

        //Получение списка ответов (заголовки) (параметр - заголовок вопрос)
        public List<string> GetCaptionReplyList(string pQuestionCaption)
        {
            for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)                if (questionList[questionIndex].QuestionCaption.Equals(pQuestionCaption))
               {                    List<string> _returnValue = new List<string>();
                    foreach (Reply curReply in questionList[questionIndex].ReplyList)
                        _returnValue.Add(curReply.ReplyCaption);
                    return _returnValue;                }
            return null;     }

        //Получение списка ответов (заголовки) (параметр - индекс вопрос)
        public List<string> GetCaptionReplyList(int pQuestionIndex)
        {
            for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)                if (questionList[questionIndex].QuestionIndex == pQuestionIndex)              {
                    List<string> _returnValue = new List<string>();
                    foreach (Reply curReply in questionList[questionIndex].ReplyList)




                        _returnValue.Add(curReply.ReplyCaption);
                    return _returnValue;          }
            return null;     }

        //Получение списка ответов (параметр - заголовок вопрос)
        public List<Reply> GetReplyList(string pQuestionCaption)
        {
            for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                if (questionList[questionIndex].QuestionCaption.Equals(pQuestionCaption))
                    return questionList[questionIndex].ReplyList;
            return null;       }
        //Получение списка ответов (параметр - индекс вопрос)        public List<Reply> GetReplyList(int pQuestionIndex)    {
            for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                if (questionList[questionIndex].QuestionIndex == pQuestionIndex)
                    return questionList[questionIndex].ReplyList;            return null;      }

        //Добавить вопрос
        public void AddQuestion(string pQuestionCaption, List<Reply> pReplyList)
        {
            if ((pQuestionCaption.Length > 0) && (pReplyList != null))
            {                for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                    if (questionList[questionIndex].QuestionCaption.Equals(pQuestionCaption))                        throw new QuestionFoundException("Такой вопрос уже существует в тесте");
                questionList.Add(new Question(pQuestionCaption, pReplyList));                SortQuestionList();
            }
            else
                throw new ParamsNotCorrectException("Заданные не верные параметры");
        }

        //Удалить вопрос
        public void RemoveQuestion(string pQuestionCaption)
        {            if (pQuestionCaption.Length > 0)            {
                bool _searchResult = false;





                for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                    if (questionList[questionIndex].QuestionCaption.Equals(pQuestionCaption))                        _searchResult = questionList.Remove(questionList[questionIndex]);
                if (_searchResult)                    SortQuestionList();
                else                    throw new QuestionNotFoundException("Вопроса в тесте не существует");
            }
            else
                throw new ParamsNotCorrectException("Заданные не верные параметры");
        }

        //Редактировать вопрос
        public void EditQuestion(string pOldQuestionCaption, string pNewQuestionCaption, List<Reply> pReplyList)
        {            if ((pOldQuestionCaption.Length > 0) && (pNewQuestionCaption.Length > 0) && (pReplyList != null))
            {                bool _searchResult = false;
                for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                    if (questionList[questionIndex].QuestionCaption.Equals(pOldQuestionCaption))
                    {
                        questionList[questionIndex].QuestionCaption = pNewQuestionCaption;
                        questionList[questionIndex].ReplyList = pReplyList;










                        _searchResult = true;
                    }                if (!_searchResult)
                    throw new QuestionNotFoundException("Вопроса нет в тесте");
            }
            else
                throw new ParamsNotCorrectException("Заданные не верные параметры");
        }

        //Сохранить тест в файл
        public bool SaveTest(string pFileName)
        {            if ((pFileName.Length > 0) && (this.TestName.Length > 0))
            {                using (FileStream file = new FileStream(pFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                {                    try
                    {                        BinaryFormatter _binFormatter = new BinaryFormatter();
                        _binFormatter.Serialize(file, this);
                        return true;                    }
                    catch { return false; }                }            }
            return false;        }

        //Загрузить тест из файла
        public static CurrentTest LoadTest(string pFileName)
        {            if ((pFileName.Length > 0) && (File.Exists(pFileName)))
            {                using (FileStream file = new FileStream(pFileName, FileMode.Open, FileAccess.Read))
                {                    try
                    {
                        BinaryFormatter _binFormatter = new BinaryFormatter();
                        return (CurrentTest)_binFormatter.Deserialize(file);
                    }











                    catch { return null; }
                }
            }            return null;
        }
    }
}



или хотелось бы видеть сразу более читаемый код ?
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace TSACore
{

    #region QuestionExceptionClasses

    public class QuestionFoundException : ApplicationException
    {
        public QuestionFoundException(string pMessage) :
            base(pMessage) { }
    }

    public class QuestionNotFoundException : ApplicationException
    {
        public QuestionNotFoundException(string pMessage) :
            base(pMessage) { }
    }

    public class ParamsNotCorrectException : ApplicationException
    {
        public ParamsNotCorrectException(string pMessage) :
            base(pMessage) { }
    }

    #endregion

    [Serializable]
    public class CurrentTest
    {
        //Название теста
        public string TestName { set; get; }

        //Список вопросов
        private List<Question> questionList = new List<Question>();

        //Сортировка номеров вопросов
        private void SortQuestionList()
        {
            for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                questionList[questionIndex].QuestionIndex = questionIndex;
        }

        //Получение общего чиста вопросов
        public int GetQuestionCount()
        {
            return questionList.Count;
        }

        //Получение списка ответов (заголовки)
        public List<string> GetCaptionQuestionList()
        {
            List<string> _returnValue = new List<string>();
            foreach (Question curQuestion in questionList)
                _returnValue.Add(curQuestion.QuestionCaption);
            return _returnValue;
        }

        //Получение списка ответов (заголовки) (параметр - заголовок вопрос)
        public List<string> GetCaptionReplyList(string pQuestionCaption)
        {
            for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                if (questionList[questionIndex].QuestionCaption.Equals(pQuestionCaption))
                {
                    List<string> _returnValue = new List<string>();
                    foreach (Reply curReply in questionList[questionIndex].ReplyList)
                        _returnValue.Add(curReply.ReplyCaption);
                    return _returnValue;
                }
            return null;
        }

        //Получение списка ответов (заголовки) (параметр - индекс вопрос)
        public List<string> GetCaptionReplyList(int pQuestionIndex)
        {
            for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                if (questionList[questionIndex].QuestionIndex == pQuestionIndex)
                {
                    List<string> _returnValue = new List<string>();
                    foreach (Reply curReply in questionList[questionIndex].ReplyList)
                        _returnValue.Add(curReply.ReplyCaption);
                    return _returnValue;
                }
            return null;
        }

        //Получение списка ответов (параметр - заголовок вопрос)
        public List<Reply> GetReplyList(string pQuestionCaption)
        {
            for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                if (questionList[questionIndex].QuestionCaption.Equals(pQuestionCaption))
                    return questionList[questionIndex].ReplyList;
            return null;
        }
        //Получение списка ответов (параметр - индекс вопрос)
        public List<Reply> GetReplyList(int pQuestionIndex)
        {
            for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                if (questionList[questionIndex].QuestionIndex == pQuestionIndex)
                    return questionList[questionIndex].ReplyList;
            return null;
        }

        //Добавить вопрос
        public void AddQuestion(string pQuestionCaption, List<Reply> pReplyList)
        {
            if ((pQuestionCaption.Length > 0) && (pReplyList != null))
            {
                for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                    if (questionList[questionIndex].QuestionCaption.Equals(pQuestionCaption))
                        throw new QuestionFoundException("Такой вопрос уже существует в тесте");
                questionList.Add(new Question(pQuestionCaption, pReplyList));
                SortQuestionList();
            }
            else
                throw new ParamsNotCorrectException("Заданные не верные параметры");
        }

        //Удалить вопрос
        public void RemoveQuestion(string pQuestionCaption)
        {
            if (pQuestionCaption.Length > 0)
            {
                bool _searchResult = false;
                for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                    if (questionList[questionIndex].QuestionCaption.Equals(pQuestionCaption))
                        _searchResult = questionList.Remove(questionList[questionIndex]);
                if (_searchResult)
                    SortQuestionList();
                else
                    throw new QuestionNotFoundException("Вопроса в тесте не существует");
            }
            else
                throw new ParamsNotCorrectException("Заданные не верные параметры");
        }

        //Редактировать вопрос
        public void EditQuestion(string pOldQuestionCaption, string pNewQuestionCaption, List<Reply> pReplyList)
        {
            if ((pOldQuestionCaption.Length > 0) && (pNewQuestionCaption.Length > 0) && (pReplyList != null))
            {
                bool _searchResult = false;
                for (int questionIndex = 0; questionIndex < questionList.Count; questionIndex++)
                    if (questionList[questionIndex].QuestionCaption.Equals(pOldQuestionCaption))
                    {
                        questionList[questionIndex].QuestionCaption = pNewQuestionCaption;
                        questionList[questionIndex].ReplyList = pReplyList;
                        _searchResult = true;
                    }
                if (!_searchResult)
                    throw new QuestionNotFoundException("Вопроса нет в тесте");
            }
            else
                throw new ParamsNotCorrectException("Заданные не верные параметры");
        }

        //Сохранить тест в файл
        public bool SaveTest(string pFileName)
        {
            if ((pFileName.Length > 0) && (this.TestName.Length > 0))
            {
                using (FileStream file = new FileStream(pFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                {
                    try
                    {
                        BinaryFormatter _binFormatter = new BinaryFormatter();
                        _binFormatter.Serialize(file, this);
                        return true;
                    }
                    catch { return false; }
                }
            }
            return false;
        }

        //Загрузить тест из файла
        public static CurrentTest LoadTest(string pFileName)
        {
            if ((pFileName.Length > 0) && (File.Exists(pFileName)))
            {
                using (FileStream file = new FileStream(pFileName, FileMode.Open, FileAccess.Read))
                {
                    try
                    {
                        BinaryFormatter _binFormatter = new BinaryFormatter();
                        return (CurrentTest)_binFormatter.Deserialize(file);
                    }
                    catch { return null; }
                }
            }
            return null;
        }

    }
}


Добавлено @ 18:04
лично мне, было бы приятнее сразу видеть второй вариант из этих двух

Добавлено @ 18:08
Цитата

Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. ©


Это сообщение отредактировал(а) Exai1e - 12.12.2009, 18:26


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
ДобренькийПапаша
Дата 12.12.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



Он считает, что надо писать говёно, чтобы говорить: "Зри в корень!, а не на форму. Учись читать любой код!".
Чтению кода посвещены книги, которые предлагают кое-какие советы для разбора чужого кода. Учится тут ничему не надо (сугубо практика).
Это не значит что ты должен писать говёный код, чтобы говорить "Практикуйтесь!".
Учится надо писать нормальный код.

Это сообщение отредактировал(а) ДобренькийПапаша - 12.12.2009, 20:00


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
mr.Anderson
Дата 12.12.2009, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



К вопросу о том, как форматировать код... Используйте в студии ReSharper и будьте счастливы, авто-реформат во время написания и нажатием пары кнопок для всего кода. И никаких проблем со стандартизацией и фразами "а мне удобно". Не мне удобно, а как надо! Кстати, дело привычки, поэтому к "как надо" тоже привыкнуть легко. Было бы желание.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
wester
Дата 12.12.2009, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: 4
Всего: 13



вроде тема о юнит тестах 

объясните , почему мы обсуждаем редкостный г@код?
а вообще да, Resharper очень сильно помогает с рутинными действиями
PM MAIL   Вверх
gwi52
Дата 12.12.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Мужики! Вы зачем здесь собрались?

Откройте отдельную тему по форматированию текста и кувыркайтесь там до посинения.
Здесь же автор темы задал простой и конкретный вопрос по тестингу.
Я привел 20 строк текста программы, в которой была изложена концепция тестирования. 
Ровно через 5 минут от Папаши появился отклик, из которого следует, что Папаше моя программа понятна, но как-то не совсем нравится.
Последние два поста содержат видимо различные варианты чего-то одного. Но каждый вариант - это 200 строк не очень простого кода.
Сравните мои 20 строк, которые через пару минут понятны любому, и 2x200, анализировать которые нет никакого желания.
Не забывайте, читабельность - это, прежде всего, компактность и обозримость.
Все, эта тема закрыта.

Когда я написал, что надеюсь на критику, то я имел в виду, что кто-нибудь расскажет нам о тестировании экстремальных состояний, о программах-имитаторах внешней среды ... - тема-то великая, существование которой корнями уходит в далекое, темное прошлое, когда мы мучились и страдали, тестируя наши программы на производственном материале. Тогда это называлось не тестированием, а обкатыванием.

На последний вопрос автора темы отвечу так. Если для Вас программирование - это приятная прогулка, то тестировать не надо, не забивайте себе голову всякой ерундой. Но если это Ваш хлеб, если Вы цените свою клиентуру и, главное, свое реномe, если Вы разумно ленивы, т.е. не хотите через месяцы и годы возвращаться к своим давно забытым программам для устранения дефектов, то отнеситесь к тестированию со всей серьезностью.
Моя дочь, программер, трудится в Америке в одной не очень крутой, но очень ответственной дивелоперской фирме, которая жесточайшим образом регламентирует не только форматирование текста программ, но и тестирование каждого произведенного модуля, т.е. они параллельно создают библиотеку тестов, доступную по любому поводу и для любого модуля. И это очень и очень правильно. Не получается быстренько что-нибудь попрограммировать.
PM MAIL   Вверх
ДобренькийПапаша
Дата 13.12.2009, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



Цитата(gwi52 @ 12.12.2009,  21:51)
Они параллельно создают библиотеку тестов, доступную по любому поводу и для любого модуля. И это очень и очень правильно. Не получается быстренько что-нибудь попрограммировать.


Останусь при своём мнении. В вырожденных случаях этого делать не стоит. Например в вашем коде вначале, тест не нужен. 


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
gwi52
Дата 13.12.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Почти согласен - такой пример считается на счетах, а лучше в уме.
Конечно, я никакой не максималист - возраст не позволяет.
Но здесь изложена только концепция, и, для упрощения, чтобы акцентировать Ваше внимание на главном, намеренно предложен максимально простой пример.
Однако, если воспользоваться грамотным тестированием, то даже здесь можно выявить экстремум (переполнение или еще какое-либо ограничение, например, такое - не может быть у меня денег больше, чем 100 баксов), который следовало бы отсечь сразу, чтобы забыть о нем навсегда.
Но, я не настаиваю, в конечном счете, у меня тоже есть масса программ, которые я считаю абсолютно надежными. Но есть и такие, которые оттестировать можно только качественно, исходя из совершенно иных, априорных принципов - в этом то и проблема...
PM MAIL   Вверх
gwi52
Дата 19.12.2009, 03:11 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Sorry! Пресловутое форматирование.

Всем привет!

И все таки не дает мне покоя программа в этой теме от автора Exai1e, 12.12.2009, 18:02.
Отсутствие критики этой программы и популярность темы, >250 просмотров, видимо,
требует от меня пояснений. 

При всем уважении к Exai1e, человек за деревьями не увидел леса. 
Он представил нам образец форматирования текста программы,
в которой собран весь возможный утилитарный сервис по вводу тестовых примеров, 
редактированию, копированию, сохранению и пр. Но идея оперативного тестирования 
в этой программе отсутствует. А вся соль-то именно в оперативности.

Попытаюсь на примере программы (см.дальше) объяснить более подробно.

Исходный класс, myClass, содержит 4 метода, Summary,Sum,Mul,Div, 
для вычисления несложной арифметики с такой же несложной ограничительной логикой.
Тестирующий класс, tester, содержит аналогично названные методы,
в каждом из которых формируется список тестовых образцов типа List<string>, 
в которых наряду с исходными параметрами записывается ожидаемый результат вычисления.
Затем эти образцы поочередно подсовываются в тестируемый метод исходного класса и 
сравниваются с ожидаемым результатом, несовпадение сопровождается соответствующим 

сообщением.
Тестирование инициируется кнопкой buttonTest после отметки соответствующей радио-кнопки,
вычисление инициируется кнопкой buttonStart после заполнения соответствующих текст-боксов.
Все контролы расположены рядом.

Можно легко протестировать любой исходный метод независимо от других и 
можно протестировать итоговый исходный метод, в котором используются все остальные методы.

Подчеркну, в проект одновременно включаются как исходные классы, так и тестирующие,
т.е. параллельно создаются две библиотеки - библиотека исходных классов и библиотека 

тестирования.
Библиотеку тестирования разработчик пополняет новыми образцами, 
здесь же возможно создание программ-имитаторов внешней среды с целью формирования 
необходимых для тестирования образцов. 

Никакого дополнительного утилитарного сервиса не требуется, поскольку каждый тест 
вместе со всеми своими образцами тестирования создается, редактируется, копируется и пр. 
также, как и любая другая программа.

Всегда при создании программы, после ее написания, мы хоть как-то должны ее оттестировать.
Но наряду с прощелкиванием и прослеживанием хода вычислений по контрольным точкам,
очень удобно контролировать программу с помощью всегда доступных полноценных тестов.
Не упускайте эту возможность. 


Код

public partial class Form1     : Form
{    public    Form1    ()    {    InitializeComponent();    }
    private void buttonStart_Click    (object sender, EventArgs e)    
    {    myClass MyClass=new myClass(Convert.ToInt32(textBox_A.Text));    
        textBox_Result.Text    =    MyClass.Summary
                               (Convert.ToInt32(textBox_B.Text),Convert.ToInt32(textBox_C.Text),Convert.ToInt32
                                 (textBox_D.Text),Convert.ToInt32(textBox_E.Text)).ToString();
    }
    private void buttonTest_Click    (object sender, EventArgs e)
    {    tester Test=new tester();
        if    (radioButton_Summary.Checked)    Test.Summary();
        if    (radioButton_Sum.Checked)        Test.Sum();
        if    (radioButton_Mul.Checked)        Test.Mul();
        if    (radioButton_Div.Checked)        Test.Div();
}    }
public class myClass                //    Тестируемый класс
{    public    myClass    ( int a )    {   A=a;     }
    public    myClass    ()        {   A=0;     }
    public    int        A;                    
    public    double    Summary    ( int b, int c, int d, int e )    
       {
           double p=Div(Sum(b,c)+Mul(d,e));    return p;
    }
    public    int        Sum           ( int b, int c )
    {     int p=b+c<0?0:b+c>100?100:b+c;
           return p;
    }
    public    int        Mul        ( int d, int e )
    {    int p=d*e<5?5:d*e>100?100:d*e;
        return p;
    }
    public    double    Div        (int f    )    
    {    double p=A!=0?(double)f/(double)A:0;
            return p;
        }
}
public class tester
{    List<string> S;    
        string [] s;
    myClass MyClass;
    public    void        Summary    ()    
    {    S=new List<string>();    
        S.Add    ("0 1 2 3 4 0");            //    Тестовые образцы
        S.Add    ("1 2 3 4 5 25");
        for  (int i=0;i<S.Count;i++)
        {    s=S[i].Split(' ');
            MyClass=new myClass (Convert.ToInt32(s[0]));
            double dResult=MyClass.Summary    
                                (Convert.ToInt32(s[1]),Convert.ToInt32(s[2]),Convert.ToInt32(s[3]),Convert.ToInt32(s[4]));
                if  (dResult!=Convert.ToInt32(s[5])) 
                            MessageBox.Show ("myClass.Summary - Sample № "+i.ToString(), "Error");
    }    }
    public    void    Sum    ()    
    {    S=new List<string>();
        MyClass=new myClass();
        S.Add    ("0 -1 0");                    //    Тестовые образцы
        S.Add    ("1 2 3");
        S.Add    ("100 200 100");
        for  (int i=0;i<S.Count;i++)
        {    s=S[i].Split(' ');
            int I=MyClass.Sum    (Convert.ToInt32(s[0]),Convert.ToInt32(s[1]));
            if  (I!=Convert.ToInt32(s[2])) 
                                   MessageBox.Show ("myClass.Sum - Sample № "+i.ToString(), "Error");
    }    }
    public    void    Mul    ()
    {    S=new List<string>();    
        MyClass=new myClass();
        S.Add    ("2 2 5");                        //    Тестовые образцы
        S.Add    ("2 3 6");
        S.Add    ("5 100 100");
        for  (int i=0;i<S.Count;i++)
        {    s=S[i].Split(' ');
            int I=MyClass.Mul    (Convert.ToInt32(s[0]),Convert.ToInt32(s[1]));
            if  (I!=Convert.ToInt32(s[2])) 
                             MessageBox.Show ("myClass.Mul - Sample № "+i.ToString(), "Error");
    }    }
    public    void    Div    ()
    {    S=new List<string>();
        S.Add    ("2 2 1");                        //    Тестовые образцы
        S.Add    ("2 3 1.5");
        S.Add    ("0 3 0");
        for  (int i=0;i<S.Count;i++)
        {    s=S[i].Split(' ');
            MyClass=new myClass(Convert.ToInt32(s[0]));
            double D=MyClass.Div    (Convert.ToInt32(s[1]));
            if  (D!=Convert.ToDouble(s[2])) 
                            MessageBox.Show ("myClass.Div - Sample № "+i.ToString(), "Error");
}    }    }

PM MAIL   Вверх
PashaPash
Дата 20.12.2009, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



gwi52, не изобретайте велосипед, используйте встроенные тесты студии. Или nUnit.

По поводу форматирования - проявите уважение к остальным участникам. Человек может съесть любое д прочитать любое спагетти, но не стоит после спрашивать его о вкусе и послевкусии.


--------------------
PM MAIL WWW   Вверх
Любитель
Дата 20.12.2009, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



-



--------------------
PM MAIL ICQ Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0918 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.