django testํ•˜๊ธฐ๐Ÿง

Han07ยท2021๋…„ 3์›” 26์ผ
0
post-thumbnail

1. test๋ฅผ ์™œ ํ•ด์•ผ๋˜๋Š”๊ฑด๋ฐ?

๊ฐœ๋ฐœ ๊ณต๋ถ€๋ฅผ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด๋ผ๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ค‘์š”์„ฑ์€ ๋‹ค๋“ค ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ค‘์š”ํ•œ ๊ฒƒ์ด๋ž‘ ์งœ๋Š” ๊ฒƒ์€ ๋‹ค๋ฅด์ง€... ๋‚˜๋„ ์ง€๊ธˆ๊นŒ์ง€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์งœ์ง€ ์•Š์•˜๊ณ , ์ค‘์š”์„ฑ ๋˜ํ•œ ๊ทธ๋ ‡๊ฒŒ ๋Š๋ผ์ง€ ๋ชปํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ญ์‹œ ์ค‘์š”ํ•˜๋‹ค ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•œ ์ด์œ ๊ฐ€ ์žˆ์—ˆ๋‹ค... ์ด๋ฒˆ์— ํ”„๋กœ์ ํŠธ ํ•˜๋‚˜๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ค‘์š”์„ฑ์„ ๋Š๋ผ๊ฒŒ ๋˜์—ˆ๋‹ค. ์งง๊ฒŒ ์š”์•ฝํ•˜์ž๋ฉด


  1. ํ”„๋กœ์ ํŠธ๋ฅผ ํ–ˆ๋‹ค. ๊ฑฐ์˜ ์™„์„ฑ๋‹จ๊ณ„๊นŒ์ง€ ๋‹ค ์งฐ๋‹ค.
  2. ์ง€๊ธˆ๊นŒ์ง€ ์ž˜ ๋˜๋˜๊ฒŒ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.
  3. ์ด๊ฒŒ ์–ด๋””์—์„œ ๋‚œ ์˜ค๋ฅ˜์ง€????
  4. ๋ชจ๋“  api ๋ฅผ postman ์œผ๋กœ ํ…Œ์ŠคํŠธํ•ด๋ณธ๋‹ค.
  5. ๋“œ๋””์–ด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ณณ์„ ์ฐพ์•˜๋‹ค.
  6. ์—ฅ ์ด๊ฒŒ ์™œ ์˜ค๋ฅ˜๊ฐ€ ๋‚ ๊นŒ?
  7. ๋‹ค์‹œ postman ์œผ๋กœ ํ•ด๋‹น ๋ถ€๋ถ„์„ ์—ฌ๋Ÿฌ ์ผ€์ด์Šค๋กœ ํ…Œ์ŠคํŠธํ•ด๋ณธ๋‹ค.
  8. ๋š๋”ฑ๋š๋”ฑ ๊ณ ์นœ๋‹ค.
  9. 2๋ฒˆ๋ถ€ํ„ฐ ๋ฐ˜๋ณต

์Œ, ์•„์ฃผ ๋ฉ‹์ง„ ๊ฒฝํ—˜์ด์—ˆ๋‹ค... ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ๊ฑด


  1. ๋‚˜๋Š” ํ˜ผ์ž์„œ ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ–ˆ๋‹ค.
  2. ๊ทธ๋ ‡๊ฒŒ ํฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ค.
  3. ์•„์ง ๋ฐฐํฌ๋„ ์•ˆํ–ˆ๋‹ค.

์ž, ์ด์ œ ์ค‘์š”์„ฑ์ด ์„œ์„œํžˆ ๋Š๊ปด์ง€๊ธฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ด๋‹ค. ํ•œ ๊ฐ€์ง€ ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด์ž. ๋‹น์‹ ์„ ํฌํ•จํ•œ 5๋ช…์ด์„œ ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ–ˆ๋‹ค. ์„ธ์ƒ์—, ๊ฐ‘์ž๊ธฐ 500์ด ๋œฌ๋‹ค! ์ด์ œ ๋‹น์‹ ์€ ๋‚˜๋จธ์ง€ 4๋ช…์„ ๋ถˆ๋Ÿฌ ๋ชจ์•„ ์˜น๊ธฐ์ข…๊ธฐ ๋ชจ์—ฌ postman ์œผ๋กœ ๋ชจ๋“  api ๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ด๋‹ค...

๋ฉฐ์น  ํ›„, ๋‹น์‹ ์˜ ํŒ€์€ ๋“œ๋””์–ด ๋ชจ๋“  ์˜ค๋ฅ˜๋ฅผ ๊ณ ์ณค๋‹ค! ๋‘๊ทผ๋‘๊ทผ, ๋ฐฐํฌ๋ฅผ ํ•˜๊ณ  ์‹ค์ œ๋กœ ์„œ๋น„์Šค๋ฅผ ํ•  ๊ฒƒ์ด๋‹ค. ์‚ฌ์šฉ์ž๋“ค์ด ๋‹น์‹ ์˜ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๊ณ ... ์ด๋Ÿฐ! 500์ด ๋–ด๋‹ค! ๋Œ€์ฒด ์ด์œ ๊ฐ€ ๋ฌด์—‡์ผ๊นŒ? ์ด์ œ ๋‹น์‹ ์€ ๋‚˜๋จธ์ง€ 4๋ช…์„ ๋ถˆ๋Ÿฌ ๋ชจ์•„ ์˜น๊ธฐ์ข…๊ธฐ...(์ƒ๋žต)

์ด์ •๋„๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ์ถฉ๋ถ„ํžˆ ์„ค๋ช…ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต๊ณ  ๊ท€์ฐฎ๋‹ค. ์‹œ๊ฐ„๋„ ๋งŽ์ด ๋“ ๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜์ค‘์— ์ƒ๊ธธ ๋ฒ„๊ทธ๋ฅผ ์ฐพ๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ํ›จ์”ฌ ์‹œ๊ฐ„์ด ๋œ ๋“ค ๊ฒƒ์ด๋‹ค...



2. test?

์‚ฌ์‹ค ๋‚˜๋„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์งœ๋ณด์ง€ ์•Š์•˜๋‹ค. ์•„๋‹ˆ ๊ทธ๋ƒฅ ์ดˆ๋ณด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์ง€์‹๋ณด๋‹ค๋Š” django ๊ณต์‹ ์‚ฌ์ดํŠธ์™€ WikiDocs ์— ์žˆ๋Š” django ์ž์Šต, ๊ทธ๋ฆฌ๊ณ  MDN ์— ์žˆ๋Š” Django ํŠœํ† ๋ฆฌ์–ผ ํŒŒํŠธ๋ฅผ ์ฐธ๊ณ ํ•œ ๊ฒƒ์„ ๋ฏธ๋ฆฌ ๋ฐํžŒ๋‹ค.

test์˜ ์ข…๋ฅ˜๋Š” ๋ฌด์ˆ˜ํžˆ ๋งŽ๋‹ค. ์ด ์ค‘, ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์„ 3๊ฐ€์ง€ ๋ฝ‘์ž๋ฉด

Unit tests (์œ ๋‹› ํ…Œ์ŠคํŠธ)

๋…๋ฆฝ์ ์ธ ์ฝคํฌ๋„ŒํŠธ์˜ (์„ฑ๋Šฅ์ด ์•„๋‹Œ) ๊ธฐ๋Šฅ์ ์ธ ๋™์ž‘์„ ๊ฒ€์ฆํ•œ๋‹ค. ํ”ํžˆ class๋‚˜ function ๋ ˆ๋ฒจ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Regression tests ( ๋ฒ„๊ทธ์ˆ˜์ • ํ™•์ธ ํ…Œ์ŠคํŠธ )

๊ธฐ์กด์— ๋ณด๊ณ ๋œ ๋ฒ„๊ทธ๋“ค์ด ์žฌ๋ฐœํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•œ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ๋Š”, ๋จผ์ € ์ด์ „์— ๋ฐœ์ƒํ–ˆ๋˜ ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ์ฒดํฌํ•œ ์ดํ›„์—, ๋ฒ„๊ทธ ์ˆ˜์ •์œผ๋กœ ์ธํ•ด ์ƒˆ๋กญ๊ฒŒ ๋ฐœ์ƒ๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธ์ฐจ ์žฌ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

Integration tests ( ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ )

์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์™„๋ฃŒํ•œ ๊ฐ๊ฐ์˜ ๋…๋ฆฝ์ ์ธ ์ฝคํฌ๋„ŒํŠธ๋“ค์ด ํ•จ๊ป˜ ๊ฒฐํ•ฉ๋˜์–ด ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์ž‘์„ ๊ฒ€์ฆํ•œ๋‹ค. ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” ์ฝคํฌ๋„ŒํŠธ๊ฐ„์— ์š”๊ตฌ๋˜๋Š” ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฒ€์‚ฌํ•˜๋ฉฐ, ๊ฐ ์ฝคํฌ๋„ŒํŠธ์˜ ๋‚ด๋ถ€์ ์ธ ๋™์ž‘๊นŒ์ง€ ๊ฒ€์ฆํ•  ํ•„์š”๋Š” ์—†๋‹ค. ์ด ํ…Œ์ŠคํŠธ๋Š” ๋‹จ์ง€ ์ „์ฒด ์›น์‚ฌ์ดํŠธ์— ๊ฑธ์ณ ๊ฐ ์ฝคํฌ๋„ŒํŠธ๊ฐ€ ๊ฒฐํ•ฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์ž‘์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋‹ค.

์ด ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๋‚ด๊ฐ€ ์ง€๊ธˆ ๋ฐฐ์šฐ๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ์œ ๋‹› ํ…Œ์ŠคํŠธ์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.



3. ์ •ํ™•ํžˆ ์–ด๋Š ๋ฒ”์œ„๊นŒ์ง€ test ํ•ด์•ผํ•˜๋Š”๊ฐ€?

๋‚˜๋„ ์ด ๋ถ€๋ถ„์ด ํ—ท๊ฐˆ๋ ธ๋‹ค. ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•œ๋‹ค๊ณ  ํ•˜์ง€๋งŒ, django์—๋Š” ๋‚ด๊ฐ€ ์งœ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ๋‹ค. ๊ณผ์—ฐ ์–ด๋””๊นŒ์ง€ ๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ๊ฐ„๋‹จํ•˜๋‹ค.

๋‚ด๊ฐ€ ๋””์ž์ธ ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ํ…Œ์ŠคํŠธ ํ•˜๋ฉด ๋œ๋‹ค.

์ดํ•ด๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž๋ฉด

models.py

class Post(models.Model):
    title = models.CharField(max_length=45)
    content = models.CharField(max_length=300)
    like = models.IntegerField
    
    def __str__(self):
       return self.title

์•„์ฃผ ๊ฐ„๋‹จํ•œ model ์ด ํ•˜๋‚˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ…Œ์ŠคํŠธ ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ ๋ฌด์—‡์ผ๊นŒ?


  1. title ์˜ ๊ธธ์ด๊ฐ€ 45๋ฅผ ๋„˜์ง€ ์•Š๋Š”๋‹ค.
  2. content ์˜ ๊ธธ์ด๊ฐ€ 300์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค.
  3. __str__()์„ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ title์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

๋ฐ”๋กœ ์ด ์„ธ๊ฐ€์ง€์ด๋‹ค. title ๊ณผ content ๊ฐ€ CharField ์ธ ๊ฒƒ๊ณผ like ๊ฐ€ IntegerField ์ธ ๊ฒƒ์€ ํ…Œ์ŠคํŠธํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด ๊ธฐ๋Šฅ๋“ค์€ django ์— ์˜ํ•ด ์ •์˜๋œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ max_length ์™€ __str__() ๋Š” ๋‹น์‹ ์ด ๋””์ž์ธํ•œ ๋ถ€๋ถ„์ด๊ณ , ์ถ”ํ›„์— ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— test ํ•ด์•ผํ•œ๋‹ค.



### 4. test ์ค€๋น„ํ•˜๊ธฐ

django ์—์„œ test ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. ์งœ๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€๋งŒ
django ์—์„œ app ์„ ๋งŒ๋“ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ tests.py ๋ผ๋Š” ํŒŒ์ผ์ด ์ƒ๊ธด๋‹ค. ์ด๊ณณ์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๋’ค python manage.py test ๋ฅผ ํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹œ์ž‘๋œ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์ˆ˜๋งŽ์€ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์•„์ฃผ์•„์ฃผ ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— test ํŒŒ์ผ์„ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

python manage.py test ๋กœ ์‹คํ–‰์‹œํ‚ค๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์กฐ๊ฑด์€ ๊ฐ„๋‹จํ•˜๋‹ค.


  1. ํŒŒ์ผ๋ช…์ด test ๋กœ ์‹œ์ž‘ํ•œ๋‹ค(tests.py, test_models.py)
  2. TestCase ๋ฅผ ์ƒ์†๋ฐ›๋Š” class ์ด๋‹ค.
  3. ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์ด test๋กœ ์‹œ์ž‘ํ•œ๋‹ค(๋˜๋Š” TestCase๊ฐ€ ์ง€์›ํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.)

์ฆ‰, ์šฐ๋ฆฌ๋Š” tests.py ํŒŒ์ผ์„ ์ด๋ ‡๊ฒŒ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋‹ค.

(์กฐ๊ธˆ ์•Œ๋ก๋‹ฌ๋กํ•˜์ง€๋งŒ ๋„˜์–ด๊ฐ€๋ฉด ๋œ๋‹ค.)

์กฐ๊ธˆ ๋” ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด์ž.

์•„์ฃผ ๊น”๋”ํ•ด์กŒ๋‹ค.

์ž, ์ด์ œ ์ •๋ง ์ฝ”๋“œ๋ฅผ ์งœ๋ณด์ž.



5. test code ์ž‘์„ฑ

models.py

from django.db import models
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _


class UserManager(BaseUserManager):

    use_in_migrations = True

    def _create_user(self, username, password, **extra_fields):
        user = self.model(username=username, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user
        

class User(AbstractBaseUser, PermissionsMixin):

    username = models.CharField(
        max_length=45,
        unique=True,
    )

    nickname = models.CharField(
        max_length=45
    )

    objects = UserManager()

    USERNAME_FIELD = 'username'

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

    def __str__(self):
        return self.username

    def get_short_name(self):
        return self.username

์œ„์™€ ๊ฐ™์€ user model์ด ์žˆ์„ ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ํ…Œ์ŠคํŠธ ํ•ด์•ผ ํ•  ๊ฒƒ์€ ๋Œ€๋žต ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. username, nickname ์˜ ๊ธธ์ด
  2. username ์ด ๊ฒน์น˜๋ฉด ์•ˆ๋จ
  3. __str__(), get_short_name์˜ return ๊ฐ’

tests/test_models.py

from django.test import TestCase

from user_system.models import User


class UserModelTests(TestCase):

    @classmethod
    def setUpTestData(cls):
        User.objects.create_user(username="testuser", password="12345", nickname="testnickname")

    def test_username_label(self):
        user = User.objects.get(id=1)
        field_label = user._meta.get_field('username').verbose_name
        self.assertEquals(field_label, 'username')

    def test_username_max_length(self):
        user = User.objects.get(id=1)
        max_length = user._meta.get_field('username').max_length
        self.assertEquals(max_length, 45)

    def test_nickname_label(self):
        user = User.objects.get(id=1)
        field_label = user._meta.get_field('nickname').verbose_name
        self.assertEquals(field_label, 'nickname')

    def test_nickname_max_length(self):
        user = User.objects.get(id=1)
        max_length = user._meta.get_field('nickname').max_length
        self.assertEquals(max_length, 45)

    def test_object_name_is_username(self):
        user = User.objects.get(id=1)
        expected_object_name = user.username
        self.assertEquals(expected_object_name, str(user))

์ด๋ ‡๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ์ƒ์†Œํ•œ ์ฝ”๋“œ๋“ค์ด ๋งŽ์„ ๊ฒƒ์ด๋‹ค ๊ฐ„๋‹จํžˆ ์„ค๋ช…์„ ํ•˜์ž๋ฉด

1.def setUpTestData()

ํด๋ž˜์Šค ์ „์ฒด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„ค์ •์„ ์œ„ํ•ด์„œ ํ…Œ์ŠคํŠธ ์‹œ์ž‘ ๋•Œ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋จ. ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ์ˆ˜์ •๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๊ฐ์ฒด๋“ค์„ ์ด๊ณณ์—์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. = ๊ฐ์ฒด ์ƒ์„ฑ

setUpTestData๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ด์šฉํ•œ๋‹ค. ๋งŒ์•ฝ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด? setUp()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

-> setUp์€ ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋จ. setUpTestData๋Š” ํด๋ž˜์Šค ์ „์ฒด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„ค์ •์„ ์œ„ํ•ด์„œ ํ…Œ์ŠคํŠธ ์‹œ์ž‘ ๋•Œ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋จ.

2. field_label = user._meta.get_field('username').verbose_name

Get the metadata for the required field and use it to query the required field data // ํ•„๋“œ ๊ฐ’ ํ™•์ธํ•˜๊ธฐ

์—ฌ๊ธฐ์„œ verbose_name์ด๋ž€ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์ข‹์€ ํ•„๋“œ ์ด๋ฆ„์„ ๋งํ•œ๋‹ค. verbose name์€ ์ง์ ‘ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ํ•„๋“œ๋ช…์˜ ์†Œ๋ฌธ์ž๋กœ ์„ค์ •๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ํŠน์ดํ•œ ์ ์€ user.username.verbose_name ์œผ๋กœ verbose name์„ ์–ป๋Š” ๊ฒƒ์ด ์•„๋‹Œ _meta ๋ฅผ ์ด์šฉํ•œ ๊ฒƒ์ด๋‹ค. user.username ์€ ์šฐ๋ฆฌ๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ฒด๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

3. assertEquals(field_label, 'username')

field_label ๊ฐ’์ด username ์ธ์ง€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‹จ, assertTrue()์™€ ๋‹ฌ๋ฆฌ ๊ทธ๋ƒฅ True, False ๊ฐ’๋งŒ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฉด ๊ฐ’๊นŒ์ง€ ์•Œ๋ ค์ค€๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€