Как вы знаете, следует ли автоматизировать тестирование или использовать руководство? - PullRequest
0 голосов
/ 06 декабря 2018

Я сделал экран входа в систему и меню для системы управления врачами.Пользователь входит в систему и отправляется в главное меню, в зависимости от типа роли у него разные элементы управления в каждом подменю.

Все работает хорошо, и теперь пришло время для тестирования.

Я никогда не проводил автоматическое тестирование - единичное, интеграционное или сквозное.

Как я понимаю, лучше отделить бизнес-логику от логики представления и только модульное тестирование бизнес-логики?

С учетом этого видимость кнопок и ящики сообщений являются логикой представления, верно?и лучше всего подходят для ручного плана тестирования, в котором я буду проверять функциональность?Это верно?

Я уверен, что мне следует выполнить модульное тестирование, если вход прошел успешно?Однако не зависит ли метод от базы данных?так это тогда интеграционное тестирование?

вот мой код

Форма входа

 private void btnLogin_Click(object sender, EventArgs e)
    {


        //Try and open a connection with database and run the code
        try
        {

            //Create new instance of sql connection, pass in the connection string for BayOneSurgerySystem.mdf to connect to database.
            SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\davie\Documents\UniWork\Software Engineering\BayOneSurgerySystem1.0\Database\BayOneSystem.mdf;Integrated Security=True;Connect Timeout=30");

            //Create new instance of SQlCommand and pass in a query to be called to retrieve table data for username and passwords aswell as the connection object.
            SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE Username = @username and Password = @password", conn);
            //This passes user input into @username and @password
            cmd.Parameters.AddWithValue("@username", txtBoxUsername.Text);
            cmd.Parameters.AddWithValue("@password", txtBoxPassword.Text);

            //Open connection with database
            conn.Open();

            //Create new instance of dataSet to hold the data retrieved from sql query
            DataSet ds = new DataSet();
            //Create new instance of DataAdpater to retrieve the data pass in Sql command
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            //using DataAdapter fill in dataSet wiht data if user input and stored data matches
            da.Fill(ds);

            //Close the connection now data table is filled with username and password
            conn.Close();

            //declare bool, true if there is a match with database and user input
            bool loginSuccess = (ds.Tables[0].Rows.Count == 1);


            //if login success is true then open menu
            if (loginSuccess)
            {
                /*Change state of enum RoleTypes based on result from dataSet Role_ID column.
                 In UserRole table records are as follows: 
                 Role_ID 1 = PracticeManager
                 2 = Doctor
                 3 = Receptionist*/

                //Print role_ID to console to check that is been set.
                Console.WriteLine(ds.Tables[0].Rows[0]["Role_ID"]);

                try
                {
                    //Condition for the switch statement is: check Role_ID from UserRoles table
                    switch (ds.Tables[0].Rows[0]["Role_ID"])
                    {
                        //if the case is that Role_ID for the user logged in is 1 then run the function etc.
                        case 1:
                            {
                                Roles.Role = Roles.RoleType.practiceManager;
                                Console.WriteLine("Role type changed to " + Roles.Role);
                            }
                            break;
                        case 2:
                            {
                                Roles.Role = Roles.RoleType.doctor;
                                Console.WriteLine("Role type changed to " + Roles.Role);
                            }
                            break;
                        case 3:
                            {
                                Roles.Role = Roles.RoleType.receptionist;
                                Console.WriteLine("Role type changed to " + Roles.Role);
                            }
                            break;
                        default:
                            break;

                    }
                }//Switch condition cannot be reached then catch exception and print to console.
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }


                Console.WriteLine("Logged in.");
                FrmMenu menu = new FrmMenu();
                menu.Show();
                this.Hide();
            }
            else
            {
                MessageBox.Show("Invalid username or password.", "Error!", MessageBoxButtons.RetryCancel);
                Console.WriteLine("Not logged in");
            }


        }

        //If connection cant be opened diplsay error message and catch exception and print to console
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            MessageBox.Show("Sorry can't connect");
        }



    }

}

}

Класс роли

 public static class Roles
{
    /*The RoleType enum is declared here and changed in form login. RoleType is the condition for button visibility
    I.e if roletype is doctor, show doctor buttons*/
    public static RoleType Role;
    public enum RoleType
    {
        practiceManager,
        doctor,
        receptionist

    }


}

Форма пациента

//if this is clicked, display yesNo messagebox. If yes, logout.
    private void btnLogout_Click(object sender, EventArgs e)
    {
        if (MessageBox.Show("Are you sure?", "Exit", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
        {
            FrmLogin logout = new FrmLogin();
            logout.Show();
            this.Close();
        }
    }

    private void FrmPatients_Load(object sender, EventArgs e)
    {

        /*Buttons are visible depending on access level. Permissions are as follows:
         * Practice Manager - Patient Records
           Doctor - Register Patient, Patient notes
           Receptionist - New Patient, Register Patient*/
        if (Roles.Role == Roles.RoleType.practiceManager)
        {
            this.btnNewPatient.Visible = false;
            this.btnNotes.Visible = false;
            this.btnSignIn.Visible = false;

        }

        else if (Roles.Role == Roles.RoleType.doctor)
        {
            this.btnNewPatient.Visible = false;
        }
        else
        {
            this.btnNotes.Visible = false;
        }

    }

    //if this is clicked return to main menu
    private void pcBxBack_Click(object sender, EventArgs e)
    {
        FrmMenu menu = new FrmMenu();
        this.Close();
        menu.Show();
    }
}

}

Тестовый класс

 [TestClass]

     public class LoginTests
     {
       [TestMethod]
         public void Constuctor_NormalData_Login_Is_Successful()
         {

            //Arrange
            //Act
            //Assert
          }


        [TestMethod]
        public void Constructor_RoleTypeEnum_RoleType_Changes()
        {
           //Arrange
           //Act
           //Assert

         }


       }

Любые рекомендации подля чего вы будете использовать автоматическое тестирование?

У меня есть таблица с 21 тестом, проверяющая все ящики сообщений, события нажатия кнопок и видимость кнопок.

Для ИИ действительно нужно некоторое автоматическое тестирование.Как вы можете видеть, у меня есть шаблон для тестирования типов ролей enum и успешных входов в систему, это только два очевидных способа тестирования, которые я вижу.

Заранее спасибо!

1 Ответ

0 голосов
/ 06 декабря 2018

В вашем случае избегайте модульного тестирования и переходите к сквозному тестированию.


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

С учетом сказанного я иду к неопределенному ответу.

Глядя на ваш btnLogin_Click методЯ вижу, что вы не отделили бизнес-логику от пользовательского интерфейса.Указанный метод знает, как подключиться к базе данных и как к ней обращаться, и знает о пользовательском интерфейсе для ее обновления, а также знает, как войти в консоль.Возможно, он знает больше, но этого достаточно для того, чтобы я советовал вам не проводить модульное тестирование.
Модульное тестирование - это, проще говоря, способ проверить, как винтики на вашей машине выглядят и ведут себя так, как вы хотите.
На вашей машине установлены все винтики.и рычаги, и спринты, и шпиндели, смешанные вместе.Я не говорю, что твой код плохой;но если вы хотите модульное тестирование , у вас впереди тяжелые времена.

Вместо этого перейдите на сквозное тестирование .
Visual Studio имеетспособ автоматизации приложений .(Я не знаю, нужен ли вам специальный уровень лицензии, так как Microsoft «забывает» описывать это, когда объясняются особенности Visual Studio.
Тогда есть Sikuli .
Тогдаесть и другие.
Я не рекомендую те, которые указаны выше, или какие-либо другие, но это должен быть ваш выбор. Покопайтесь и протестируйте, чтобы найти тот, который вам нравится. Многие из них F / OSS.

HTH
и счастливого взлома!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...