Testing for project - SilverSky9/DevToolNo1 GitHub Wiki

How to run ??

Click here!!!!!!!!!!!!!!!!


Frontend

  • ในการทดสอบหน้าบ้านเครื่องมือที่เลือกใช้คือ Cypress
  • มีการแบ่งการทดสอบออกเป็น 3 ระดับ คือ 1. Unit test 2. Component test 3. End-to-end test

Unit test

1. การทดสอบ render หน้า index

  it("should render Index", () => {
    shallow(<Index />);
  });

2. การทดสอบ render ประเภทสินค้า

  it("render all tag", () => {
    const wrapper = mount(<Index allTag={tag} />);

    expect(wrapper.find('ul').children().length).toBe(3)
  });

3. การทดสอบการเรียก function

  it("should add data to tag want", () => {
    const mockFn = jest.fn()
    const { queryByTestId } = render(
      <Index allTag={tag} onClick={mockFn} />,
    );
    fireEvent.click(queryByTestId('button0'));
    expect(queryByTestId('tagWant').childNodes.length).toBe(1);

  });

4. การทดสอบ render หน้า home

  it("should render Home", () => {
        shallow(<Home tag={tag} />);
    });

5. การทดสอบ render ประเภทสินค้า

    it("render all tag", () => {
        const wrapper = shallow(<Home posted={posted} tag={tag} />);
        expect(wrapper.find('ul').children().length).toBe(3)
    });

6. การทดสอบ render โพสต์

    it("render all posts", () => {
        const wrapper = shallow(<Home posted={posted} tag={tag} />);
        expect(wrapper.find('ul').children().length).toBe(3)
    });

Component test

1. ทดสอบการค้นหาโพสต์ด้วยชื่อของสินค้า

describe('Search by title', () =>{
    before(() =>{
        cy.visit("http://localhost:8080/Home")
    })
    it('search "com"', () =>{
        cy.get('input').type('com').wait(1000)
        cy.get('#search').click().wait(1000)
    })
})
  • เป็นการทดสอบการค้นหาโพสต์ด้วยชื่อของสินค้าที่ชื่อ com จากนั้นจะมีการกดปุ่ม Search
  • หลังจากการกดปุ่ม Search แล้วการแสดงผลของโพสต์จะเปลี่ยนไป โดยจะปรากฏขึ้นเฉพาะโพสต์ที่มีชื่อสินค้าตรงกับที่ได้ค้นหา

2. ทดสอบการค้นหาโพสต์ด้วย blank space

describe('Search by blank space', () =>{
    before(() =>{
        cy.visit("http://localhost:8080/Home")
    })
    it('search ""', () =>{
        cy.get('#search').click().wait(1000)
    })
})

  • เป็นการทดสอบการค้นหาโพสต์ด้วยชื่อของสินค้าด้วย blank space จากนั้นจะมีการกดปุ่ม Search
  • หลังจากการกดปุ่ม Search แล้วการแสดงผลของโพสต์จะเปลี่ยนไป โดยจะปรากฏขึ้นมาทุกโพสต์ที่อยู่ในระบบ

3. ทดสอบการค้นหาโพสต์ด้วย white space

describe('Search by white space', () =>{
    before(() =>{
        cy.visit("http://localhost:8080/Home")
    })
    it('search " "', () =>{
        cy.get('#search').click().wait(1000)
    })
})

  • เป็นการทดสอบการค้นหาโพสต์ด้วยชื่อของสินค้าด้วย white space จากนั้นจะมีการกดปุ่ม Search
  • หลังจากการกดปุ่ม Search แล้วการแสดงผลของโพสต์จะเปลี่ยนไป โดยจะปรากฏขึ้นมาทุกโพสต์ที่อยู่ในระบบ

4. ทดสอบการกรองโพสต์ด้วยประเภทของสินค้าครั้งละ 1 ชนิด

describe('Select tag in home page', () =>{
    before(() =>{
        cy.visit("http://localhost:8080/Home")
    })
    it('Select all tag in home page', () =>{
        cy.get('.tag').eq(0).click().wait(1000)
        cy.get('.tag').eq(1).click().wait(1000)
        cy.get('.tag').eq(2).click().wait(1000)
    })
})
  • เป็นทดสอบการกรองโพสต์ด้วยประเภทของสินค้าครั้งละ 1 ชนิด
  • หลังจากการกดปุ่มประเภทของสินค้าในแต่ละครั้งการแสดงผลของโพสต์จะเปลี่ยนไป โดยโพสต์ที่ปรากฏขึ้นจะถูกกรองตามประเภทสินค้าที่ได้เลือกกรอง

End-to-end test

describe('Select com tag', () =>{
    before(() => {
        cy.visit("http://localhost:8080").wait(1000)
    })
    it('should com and click next btn', () =>{
        cy.get('button').contains('com').click().wait(1000)   
        cy.get('button').contains('food').click().wait(1000)
        cy.get('button').contains('it').click().wait(1000)
        cy.get('button').contains('com').click().wait(1000)
        cy.get('button').contains('food').click().wait(1000)
        cy.get('#next-button').click().wait(1000)
        cy.get('#productName').contains("Moblie phone 2 hand").wait(1000)
        cy.contains('com').click().wait(1000)
        cy.contains('it').click().wait(1000)
        cy.contains('food').click().wait(1000)
        cy.get('input').type('thai').wait(1000)
        cy.get('#search').click().wait(1000)
    })
})
  • เริ่มจากหน้าแรก มีการทดลองกดปุ่มประเภทรายการสินค้าต่างๆ เพื่อทดสอบ function ภายในปุ่มมีรายละเอียดการทำงานคือ ต้องกดเลือกประเภทสินค้าอย่างน้อย 1 รายการและสามารถเลือกประเภทสินค้าหลายรายการได้ และหากต้องการยกเลิกการเลือกประเภทสินค้านั้น ๆ สามารถกดปุ่มเดิมซ้ำเพื่อเป็นการยกเลิกได้
  • เมื่อเลือกรายการสินค้าสำเร็จจะกดปุ่ม Next เพื่อไปยังหน้าถัดไป
  • หน้าถัดไปคือ หน้าหลักการใช้งานจะมีโพสต์ปรากฏขึ้น ซึ่งโพสต์ที่ปรากฏขึ้นจะเป็นโพสต์ที่อยู่ในประเภทสินค้าที่เลือกไว้ในหน้าแรก โดยมีการทดสอบให้กดโพสต์นั้นได้
  • ในหน้าหลักการใช้งานยังสามารถเลือกการกรองอีกครั้งจากประเภทสินค้าที่ปรากฏทางแถบขวามือ และยังสามารถค้นหาชื่อสินค้าที่ต้องการจากช่อง search

Backend

  • ในการทดสอบหลังบ้านเครื่องมือที่เลือกใช้คือ go

1. การทดสอบการ Get โพสต์ทั้งหมด

func Test_GetAllPost(t *testing.T) {
	app := fiber.New()

	controllers.Route(app)

	res, err := app.Test(httptest.NewRequest("GET", "/post/all", nil))
	utils.AssertEqual(t, nil, err, "app.Test")
	utils.AssertEqual(t, 200, res.StatusCode, "Status code")
}

2. การทดสอบการ Get โพสต์ด้วย ID

func Test_GetPostById(t *testing.T) {
	app := fiber.New()

	controllers.Route(app)
	res, err := app.Test(httptest.NewRequest("GET", "/post/getbyid/2", nil))
	utils.AssertEqual(t, nil, err, "app.Test")
	utils.AssertEqual(t, 200, res.StatusCode, "Status code")
}

3. การทดสอบการ Get โพสต์ด้วยประเภทสินค้า

func Test_GetPostByTag(t *testing.T) {
	app := fiber.New()

	controllers.Route(app)
	res, err := app.Test(httptest.NewRequest("GET", "/post/getbytag/6/7", nil))
	utils.AssertEqual(t, nil, err, "app.Test")
	utils.AssertEqual(t, 200, res.StatusCode, "Status code")
}

4. การทดสอบการสร้างโพสต์

func TestCreatePost(t *testing.T) {
	post_test := model.Post{
		PostId:        2,
		PinId:         99,
		ProductName:   "want thai ice tea",
		PostDate:      time.Now(),
		ProductOption: "buy",
		Price:         50,
		Amount:        1,
		TagId:         99,
	}
	user_test := model.User{
		UserId:      2,
		Name:        "tester naja",
		Address:     "localhost",
		Contact:     "[email protected]",
		PhoneNumber: "1212312121",
	}
	pin_test := model.Pin{
		PinId:  99,
		Pin:    "99999999",
		UserId: 2,
	}
	tag_test := model.Tag{
		TagId:   99,
		TagName: "food",
	}
	type args struct {
		post model.Post
		tag  model.Tag
		user model.User
		pin  model.Pin
	}
	tests := []struct {
		name    string
		args    args
		wantErr bool
	}{
		// TODO: Add test cases.
		{name: "Create-post-test-1", args: args{post: post_test, tag: tag_test, user: user_test, pin: pin_test}, wantErr: false},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if err := services.CreatePost(tt.args.post, tt.args.tag, tt.args.user, tt.args.pin); (err != nil) != tt.wantErr {
				t.Errorf("CreatePost() error = %v, wantErr %v", err, tt.wantErr)
			}
		})
	}
}
⚠️ **GitHub.com Fallback** ⚠️