如何从“测试”包中测试Golang中的主包?

时间:2019-01-01 16:33:50

标签: api unit-testing go

我有一个用Golang编写的简单程序。这是一个API。因此,在项目文件夹中,有一个名为@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_image_detect); intent = getIntent(); imageBytes = intent.getByteArrayExtra("CapturedImage"); cameraWidth = intent.getIntExtra("width", 0); cameraHeight = intent.getIntExtra("height", 0); bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); bitmap = Bitmap.createScaledBitmap(bitmap, cameraWidth, cameraHeight, false); image = FirebaseVisionImage.fromBitmap(bitmap); detector = FirebaseVision.getInstance().getOnDeviceTextRecognizer(); result = detector.processImage(image) .addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() { @Override public void onSuccess(FirebaseVisionText firebaseVisionText) { String resultText = firebaseVisionText.getText(); Log.d("TEST", resultText); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { } }); } 的文件夹,其中包含我的cmd程序包(用于初始化应用程序并定义API的端点)。还有一个以我的程序命名的文件夹,其中包含来自一个也以我的程序命名的包中的多个文件。该程序包充当执行所有必要查询的模型,并包含我定义的所有类型。

我还创建了一个名为main的文件夹。它在名为test的程序包下包含我的所有测试文件。问题是要运行测试,我必须访问我的主程序包! Golang有办法做到这一点吗?我尝试仅使用test,但当然不起作用。

我也有个主意。也许我可以将所有初始化函数(在import "cmd/main"文件夹中)移动到以我的程序命名的包中。这样,我可以在cmd中进行常规的import。然后,我在test包中的cmd内创建了一个main.go,作为编译器的入口点。

我是Go的新手,所以我不太自信。您认为这是正确的方法吗?

谢谢。

编辑:显然有人认为这个问题是重复的,但事实并非如此。这是我对评论的解释:

  

我在发布之前阅读了此信息,但没有回答我的问题   因为在那个帖子中,这个人的测试包在主程序包中。的   我问我的问题的原因是因为我不想拥有我的   在主程序包中进行测试。我宁愿将它们全部放在测试文件夹中   在同一包装内。

1 个答案:

答案 0 :(得分:1)

您想做的事在GO中是不可能的(假设您要测试私有功能)。

  

因为我不想在主程序包中进行测试。我宁愿   将它们全部放在同一软件包内的测试文件夹中。

如果将代码移到其他文件夹中,则您的代码属于不同的软件包。

这就是GO定义软件包https://golang.org/doc/code.html#Organization的方式:

  

每个程序包均以单个形式包含一个或多个Go源文件。   目录。

这是您的代码结构:

main
| -- main.go (package main)
+ -- test
     | -- main_test.go (package test)

习惯上将测试与代码保存在同一文件夹中。如果语言或框架设置了开发人员必须遵循的一些规则,这是正常的。 GO对此非常严格。

这是组织代码的方式:

main
| -- main.go (package main)
| -- main_test.go (package main_test)
| -- main_private_test.go (package main)

通常有必要针对其公共接口测试代码。最好的方法是将测试放入不同的程序包中。 GO约定是将测试保存在同一文件夹中,这导致使用相同的程序包名称。有针对该问题的解决方法。您可以在测试的程序包名称中添加_test(程序包main_test)前缀。

如果无法使用公共接口测试您的代码,则可以添加另一个带有测试的文件,并在该文件中使用package main