簡體   English   中英

具有外部軟件包依賴關系的Golang測試未通過Gitlab Ci傳遞,而是通過本地傳遞

[英]Golang test with external package dependency isn't passing with Gitlab Ci, but pass in local

我已經測試:

package misc

var (
    Trace   *log.Logger
    Info    *log.Logger
    Warning *log.Logger
    Error   *log.Logger
)

func TestFTPGetFilesFromServer(t *testing.T) {
    misc.InitLogger(4) 
}

with InitLogger is located in another package

func InitSimpleLogger(level int) {
    if level == 1 {
        Trace = log.New(ioutil.Discard, "[TRACE]\t", log.Ldate|log.Ltime|log.Lshortfile)
        Info = log.New(ioutil.Discard, "[INFO]\t", log.Ldate|log.Ltime|log.Lshortfile)
        Warning = log.New(ioutil.Discard, "[WARNING]\t", log.Ldate|log.Ltime|log.Lshortfile)
        Error = log.New(os.Stdout, "[ERROR]\t", log.Ldate|log.Ltime|log.Lshortfile)
    } else if level == 2 {
        Trace = log.New(ioutil.Discard, "[TRACE]\t", log.Ldate|log.Ltime|log.Lshortfile)
        Info = log.New(ioutil.Discard, "[INFO]\t", log.Ldate|log.Ltime|log.Lshortfile)
        Warning = log.New(os.Stdout, "[WARNING]\t", log.Ldate|log.Ltime|log.Lshortfile)
        Error = log.New(os.Stdout, "[ERROR]\t", log.Ldate|log.Ltime|log.Lshortfile)
    } else if level == 3 {
        Trace = log.New(os.Stdout, "[TRACE]\t", log.Ldate|log.Ltime|log.Lshortfile)
        Info = log.New(ioutil.Discard, "[INFO]\t", log.Ldate|log.Ltime|log.Lshortfile)
        Warning = log.New(os.Stdout, "[WARNING]\t", log.Ldate|log.Ltime|log.Lshortfile)
        Error = log.New(os.Stdout, "[ERROR]\t", log.Ldate|log.Ltime|log.Lshortfile)
    } else {
        Trace = log.New(os.Stdout, "[TRACE]\t", log.Ldate|log.Ltime|log.Lshortfile)
        Info = log.New(os.Stdout, "[INFO]\t", log.Ldate|log.Ltime|log.Lshortfile)
        Warning = log.New(os.Stdout, "[WARNING]\t", log.Ldate|log.Ltime|log.Lshortfile)
        Error = log.New(os.Stdout, "[ERROR]\t", log.Ldate|log.Ltime|log.Lshortfile)
    }
}

編輯:

我有:

ftph := ftp_handler.NewFTPHandler()
ftp, err = ftph.connect()

與NewFTPHandler()

func NewFTPHandler() *FTPHandler {
    return &FTPHandler{
        Addr:     os.Getenv("FTP_ADDR"),
        username: os.Getenv("FTP_USER"),
        password: os.Getenv("FTP_PASSWD"),
        key:      os.Getenv("FTP_SGEKEY"),
        iv:       os.Getenv("FTP_SGEIV"),
        Port:     os.Getenv("FTP_PORT"),
    }
}

並調用connect():

func (fh *FTPHandler) connect() (*goftp.FTP, error) {
    var err error
    var ftp *goftp.FTP
    if ftp, err = goftp.Connect(fh.Addr + ":" + fh.Port); err != nil {
        misc.Error.Println("Cannot reach the FTP server", fh.Addr, "with port", fh.Port, "\t:", err)
        return nil, err
    }
    if err = ftp.Login(fh.username, fh.password); err != nil {
        misc.Error.Println("Bad credential for the FTP server", fh.Addr, "with port", fh.Port, "\t:", err)
        return nil, err
    }
    return ftp, nil
}

當我在gitlab-ci中運行測試時,代碼行:

misc.InitLogger(4) 

運行時失敗

--- FAIL: TestFTPConnect (0.00s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
    panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x5ef467]

goroutine 5 [running]:
testing.tRunner.func1(0xc0000ea100)
    /usr/local/go/src/testing/testing.go:792 +0x387
panic(0x6af2a0, 0x9205a0)
    /usr/local/go/src/runtime/panic.go:513 +0x1b9
log.(*Logger).Output(0x0, 0x2, 0xc00004e0e0, 0x63, 0x0, 0x0)
    /usr/local/go/src/log/log.go:153 +0x47
log.(*Logger).Println(0x0, 0xc0000f9ef8, 0x6, 0x6)
    /usr/local/go/src/log/log.go:188 +0x6a
gitlab.com/ColinBois/pamela/ftp_handler.(*FTPHandler).connect(0xc000050480, 0xc00002c798, 0x4766a6, 0x5c52ff3a)
    /root/go/src/gitlab.com/ColinBois/pamela/ftp_handler/ftpHandler.go:45 +0x1f3
gitlab.com/ColinBois/pamela/ftp_handler.TestFTPConnect(0xc0000ea100)
    /root/go/src/gitlab.com/ColinBois/pamela/ftp_handler/ftpHandler_test.go:20 +0x27
testing.tRunner(0xc0000ea100, 0x717140)
    /usr/local/go/src/testing/testing.go:827 +0xbf
created by testing.(*T).Run

這是我的gitlab-ci.yml

test:
  image: docker:18
  services:
    - docker:dind
  stage: test
  before_script:
    - touch test.env
    - apk update
    - apk upgrade
    - apk add --no-cache py-pip
    - pip install docker-compose
    - docker network create mygoapp_network
    - mkdir -p volume/log

  script:
    - docker-compose -f docker-local.yaml up --build -d
    - docker exec mygoapp go test ./... -v

這些測試不能確保在依賴此函數調用的副作用的測試之前執行misc.InitSimpleLogger(4) 將調用移至init()函數,以確保在測試之前執行該調用。 更改

func TestFTPGetFilesFromServer(t *testing.T) {
    misc.InitLogger(4) 
}

func init() {
    misc.InitLogger(4) 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM